"Schrödinger Programmiert Java" kann ich sehr empfehlen. Das Buch richtet sich an Leute, die noch nie was mit Programmieren zu tun hatten, umfasst aber auch fortgeschrittene Themen.
Mir persönlich hat es sehr weitergeholfen. Die Ausgabe, die ich habe, beschäftigt sich bis inklusive Java 9, ist also noch recht aktuell.
Ansonsten ist "Java ist auch eine Insel" ein sehr gutes Nachschlagewerk. Da gibt es aber eine gratis Version im Internet.

...zur Antwort

Ich programmiere seit einer Weile Discord Bots mit der Java Discord API, kurz JDA. Das kann ich auch empfehlen, würde aber Einsteigern nicht unbedingt dazu raten.
Es kommt ganz drauf an, welche Programmiersprache du beherrschst und danach solltest du auch den Wrapper wählen. Wenn du keine kannst, solltest du vorher eine lernen, denn sonst wirst du Schwierigkeiten mit solchen APIs kriegen.
Zur Spracheingabe: Ja, das wäre theoretisch möglich. Du müsstest halt gucken, ob du eine vernünftige API dafür findest. Die Amazon Alexa API bspw. versorgt dich damit nicht. Keine Ahnung, wie es bei der Konkurrenz aussieht.

...zur Antwort

Java 8 war schon ein sehr großer Schritt, da damit erst mehr oder weniger funktionelles Programmieren in Java gefördert wurde. Streams, Lambda, Methodenreferenzen usw., alles Java 8. Mit Java 9 kam dann Jigsaw. Das Thema ist aber unglaublich komplex und für Anfänger eher uninteressant. Java 10s berühmteste Neuerung ist wohl das "var"-Keyword, besser gesagt lokale Typinferenz. Das ist allerdings eher eine kleine Änderung. Es gab mit 10 außerdem ein paar Überarbeitungen beim Collections-Framework, vor allem an unmodifizierbaren Collections soweit ich weiß. Das mal so im Überblick. Natürlich gab es jeweils immer noch kleine Änderungen. Aber hey, jetzt steht erstmal Java 11 vor der Tür :)

...zur Antwort

Komplett zufällig ist denk ich mal schwer, da selbst mit einem guten Zufallsalgorithmus in 50% der Fälle Spieler rauskommen, die es nicht gibt. Zumindest ist mir gerade keine Möglichkeit bekannt, irgendwie eine offizielle Liste mit Spielernamen zu erhalten.
Du könntest von dem Server einen random Spieler picken mit

Bukkit.getOnlinePlayers().get(ThreadLocalRandom.current().nextInt(Bukkit.getOnlinePlayers().size())

...zur Antwort

Die Referenz "sb" ist null. Ist ja auch klar - du initialisierst dieses Attribut nirgendwo. Und wenn du versuchst, auf sb zuzugreifen, wenn es null ist, gibt es eine NullPointerException.

...zur Antwort

Für blutige Anfänger nicht, zumindest würde ich das nicht sagen. Es ist ein gutes Buch, wenn man sich schnell über einen Java-Themenbereich informieren möchte. Aber es "begleitet" einen nicht beim Lernen.

Ich finde, dass "Schrödinger Programmiert Java" ein super Buch für Anfänger ist. Das beginnt bei 0 und deckt dann die Grundlagen sauber ab.

...zur Antwort

[JAVA/MAVEN] Was ist der Fehler?

Hallo,

ich möchte mit Maven ein Java Projekt so bearbeiten, dass ich ein weiteres Event hinzufügen kann. Leider kenne ich mich nicht gerade gut aus mit Maven, deswegen frage ich mich, was ich falsch mache.

package net.md_5.bungee.api.event;

import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; import net.md_5.bungee.api.Callback; import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.plugin.Event;

/*   Event called to represent a player logging in.  */ @Data @ToString(callSuper = false) @EqualsAndHashCode(callSuper = false) public class JoinLobbyEvent extends Event {

    /*       Connection to send to a Lobby Server      */     private final UserConnection connection;

public JoinLobbyEvent(UserConnection connection)
{
        this.connection = connection;
}

public UserConnection getConnection()
{
        return connection;
}

}

Das ist der Quelltext der Klasse und das ist der Error:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project bungeecord-api: Compilation failure: Compilation failure:
[ERROR] /D:/ThangDevelopment/mnqstcord/api/src/main/java/net/md_5/bungee/api/event/JoinLobbyEvent.java:[7,23] cannot find symbol
[ERROR]  symbol:  class UserConnection
[ERROR]  location: package net.md_5.bungee
[ERROR] /D:/ThangDevelopment/mnqstcord/api/src/main/java/net/md_5/bungee/api/event/JoinLobbyEvent.java:[22,19] cannot find symbol
[ERROR]  symbol:  class UserConnection
[ERROR]  location: class net.md_5.bungee.api.event.JoinLobbyEvent
[ERROR] /D:/ThangDevelopment/mnqstcord/api/src/main/java/net/md_5/bungee/api/event/JoinLobbyEvent.java:[24,31] cannot find symbol
[ERROR]  symbol:  class UserConnection
[ERROR]  location: class net.md_5.bungee.api.event.JoinLobbyEvent
[ERROR] /D:/ThangDevelopment/mnqstcord/api/src/main/java/net/md_5/bungee/api/event/JoinLobbyEvent.java:[29,16] cannot find symbol
[ERROR]  symbol:  class UserConnection
[ERROR]  location: class net.md_5.bungee.api.event.JoinLobbyEvent
[ERROR] -> [Help 1]

Anscheinend wird die Klasse UserConnection nicht richtig importiert, aber ich habe sie doch importiert...

Vielen Dank!

...zur Frage

Das sieht danach aus, als hättest du eine Maven Dependency nicht importiert. Schick mal bitte deine pom.xml. Steht bei dir irgendwo "Import Changes" o.Ä.? Dann klick das mal an.

...zur Antwort

Wie kann ich mit Java prüfen, ob ein Satz in einer Textdatei enthalten ist?

else if (event.getSource() == blesen) {
  FileReader fr = null;

  try {
    String text;
    String fileName = "D:/Flo/password/loggin.txt";
    File file = new File(fileName);
    int len = (int)file.length();
    char[] buf = new char[len];

    fr = new FileReader(file);
    fr.read(buf);
    text = new String(buf);

    // ab hier JFrame
    JFrame auslesen = new JFrame("Output Dialog");
    auslesen.setLayout(null);
    auslesen.setVisible(true);
    auslesen.setSize(290, 250);
    auslesen.setResizable(false);
    auslesen.setTitle("Auslesen");

    auslesen.setDefaultCloseOperation(EXIT_ON_CLOSE);
    auslesen.setLocationRelativeTo(null);
    
    // bis hier her JFrame | ab hier dann eingabe feld
    JTextField plattlesen = new JTextField();
    JLabel welcheplatt = new JLabel("<html>Welche Loggin Daten <p /"
      + ">möchtestdu wissen?</p"
      + ">Plattform:</html>");
    
    auslesen.add(bfertiglesen);
    bfertiglesen.setBounds(1, 100, 100, 30);
    auslesen.add(plattlesen);
    plattlesen.setBounds(1, 70, 100, 20);
    auslesen.add(welcheplatt);
    welcheplatt.setBounds(1, 1, 200, 50);

    slesen = plattlesen.getText();
    System.out.println(text);
  }
  catch(IOException ex) {
    System.out.println(ex);
  }
  finally {
    try {
      if (fr!= null) fr.close();
    }
    catch(Exception ex) {
    }
  }
}
else if (event.getSource() == bfertiglesen) {
  slesen = plattlesen.getText();

  if (text.indexOf(slesen)) {
    System.out.println(slesen);
  }
}

Ich möchte prüfen, ob ein eingegebener Satz in einem Textdokument enthalten ist.

Wie mache ich das am besten?

...zur Frage

Hallo LordDerDunkel,

ich würde so etwas mithilfe von java.nio statt java.io überprüfen. Es geht natürlich mit beidem, aber ich habe mich inzwischen an ersteres gewöhnt.

Ich weiß nicht genau, wie du deine Ausgaben haben willst, deshalb hier nur, wie ich es grundsätzlich machen würde:

String text;
String fileName = "D:/Flo/password/loggin.txt";
Path file = Paths.get(fileName);
try {
    text = new String(Files.readAllBytes(file));
    boolean satzIstEnthalten = text.contains("Dein Satz.");
} catch (IOException e) {
    e.printStackTrace();
}

satzIstEnthalten würde nun true sein, wenn in dem Dokument "Dein Satz." steht. Eventuell musst du bei dir noch auf die Codierung achten, also ob das Ganze in UTF-8 ist, beispielsweise. Sonst steht in dem String text dann was anderes drin als in der Datei.

LG

...zur Antwort

Gleichzeitig nur mit Ansynchronität, also mehreren Threads (wobei das auch nicht zwingend "gleichzeitig" sein muss). Aber du kannst so viele Objekte erzeugen, wie du willst, auch in einer Schleife.
Naja, bis du dann den OutOfMemoryError kriegst. Aber das sollte wohl kaum passieren, außer du legst es darauf an.

...zur Antwort

Also erstmal würde es mich wundern, wenn der Fehler wirklich "cannot convert boolean to String" lauten würde. Aber wie auch immer.

Du hast eine Variable read, von der ich eigentlich denken würde, sie repräsentiert die eingelesene Zeile. Aber du weist ihr hintereinander zwei Werte zu, die absolut keinen Sinn ergeben, da sie danach sowieso mit der eingelesenen Zeile überschrieben werden.

Was du tun willst:

  1. Eine zufällige Zahl mit Random#nextInt() erstellen
  2. Die Zeile einlesen
  3. Die Zeile in eine Zahl umwandeln mit Integer.parseInt(zeile)
  4. Prüfen, ob derjenige die richtige Zahl eingegeben hat

Im Pseudocode:

zahl = zufällige Zahl
eingabe = eingelesene Zeile
eingegebene Zahl = in eine Zahl umgewandelte Eingabe

wenn eigegebene Zahl gleich zahl
  // gewonnen
ansonsten wenn eingegebene Zahl kleiner als zahl
  // tipp
ansonsten wenn eingegebene Zahl größer als zahl
  // tipp

Theoretisch könntest du auch dafür sorgen, dass das Programm so lange läuft, bis derjenige die Zahl erraten hat oder er keine "Leben" o.Ä. mehr hat.

Was du da mit den ifs gemacht hast, weiß ich aber auch nicht.

...zur Antwort

Ich empfehle dir eine IDE bei solchen Fehlern. Die erkennt noch vor dem Kompilieren Fehler und markiert diese. Der Fehler wurde aber ja jetzt gelöst :)

...zur Antwort

Nein, wenn ich dich richtig verstanden habe, geht das nicht. Selbst wenn Klasse A von Klasse B erbt, ist Liste<A> keine Subklasse von Liste<B>.

Wenn du es offenhalten willst, was genau in die Liste kommt, sind Wildcards dein Stichwort. Für das obere Beispiel bräuchtest du z.B. in Klasse B eine Liste mit "? extends B" als Typ-Parameter.

Damit du das richtig verstehst, solltest du dich näher mit Generics beschäftigen.

LG

...zur Antwort

Überflüssige Klammern gibt es eigentlich kaum bei Java. Zumindest nicht, wenn man nicht mit der Intention an einen Code herangeht, überflüssige Klammern zu erstellen.

In der Hinsicht ist Java eigentlich recht streng. Das einzige, wo du praktisch unendlich viele Klammern machen kannst, sind Rechenoperationen. Da ist das genau wie in der Mathematik. Auch geschweifte Klammern {} kannst du so viele setzen, wie du willst. Das macht aber absolut keinen Sinn.

Bei vielen Dingen, die normalerweise Klammern {} benötigen, kann man diese weglassen, wenn sie nur einen Befehl enthalten. Man sollte sich das Ganze jedoch gut überlegen, gerade bei komplexerem Code kann das schnell zu Fehlern führen.

if (true) 
  // Anweisung

while (true) 
  // Anweisung

if (false) {
} else
  // Anweisung
...zur Antwort

Eine Ganzzahl mit einem bestimmten Wertebereich, der hier von anderen schon zuhauf genannt wurde.

Was in Bezug auf Java eventuell noch interessant zu wissen wäre, ist, dass es in Java standardmäßig zwei "unterschiedliche" Integer gibt. Einmal den primitiven Datentyp (int) und die zugehörige Wrapperklasse (Integer). Für Variablen nutzt man normalerweise int. Integer ist eine Klasse, deshalb verbraucht sie mehr Speicher (beim Erzeugen eines neuen Objekts), dafür hat sie aber auch einige Methoden, die beim Umgang mit Integern hilfreich sein können.

...zur Antwort

Für primitive Datentypen heißt das "ungleich". Es liefert also true zurück, wenn links und rechts davon zwei unterschiedliche Werte stehen. Anders als bei komplexen Datentypen, also Objekten. Hier werden, wie auch schon richtig gesagt wurde, die Pointer verglichen, also ob sie auf DASSELBE Objekt im Heap zeigen (oder besser gesagt nicht). D.h., der Vergleich kann true zurückgeben, selbst wenn die Objekte völlig identisch sind.

...zur Antwort

Diese Aufgabe ist nun wirklich nicht schwer und sollte für jeden lösbar sein, der sich mehr als einen Tag mit Java beschäftigt.

Die Attribute sind sogar schon vorgegeben.
Diese definierst du in deiner Klasse. Jetzt brauchst du noch einen Konstruktor, der entsprechende Parameter entgegennimmt und deren Werte den Attributen zuweist.
Deine Methode fliegen ist auch schnell geschrieben. Hier muss lediglich die Formel für gleichförmige Bewegungen angewendet werden:

Weg = Geschwindigkeit / Zeit

Das kannst du quasi 1 zu 1 so übernehmen.
Für die Ausgabe bedienst du dich einfach System.out.println(). Dort kannst du alle Attribute als Parameter angeben.

Das ist nun wirklich nicht schwer.

...zur Antwort

Bei = handelt es sich um eine Zuweisung. Mit dem mathematischen = hat das gar nichts zu tun. Wenn ich also einer Variable einen Wert zuweisen möchte, nutze ich

[Variable] = [Wert];

Bei == handelt es sich um einen Vergleichsoperator. Wenn auf beiden Seiten ein Wert oder eine Referenz auf einen Wert steht, nennt sich das Ganze boolescher Ausdruck, in anderen Worten, eine Aussage, die wahr oder falsch sein kann.
== überprüft hierbei die Gleichheit der Werte. Bei primitiven Datentypen (int, double, char) ist das ähnlich zur mathematischen Gleichheit, bei komplexen Datentypen (also Klassen) hingegen wird geprüft, ob es sich um ein und dasselbe Objekt im Heap handelt. Selbst wenn also zwei Objekte völlig identisch sind, wird beim vergleichen mit == ein false zurückgegeben.

...zur Antwort