Coding mit Java | Java-basierten APIs

  • Ersteller Ersteller ij9F_i0FaF-d9lrDSDDpDbfo
  • Erstellt am Erstellt am
Status
Für weitere Antworten geschlossen.
Hört sich total ressourcensparend an.
die abfrage läuft asynchron also durch runTaskTimerAsynchronous und ich benutze auch thread sleep..
also müsste das mit ressourcensparend halb so schlimm sein. glaube ich.

Man kann auch eine Methode für die Abfrage erstellen, die vor dem eigentlichen Abfragen überprüft, ob eine Verbindung besteht. Das ist auf jeden Fall ressourcensparender als der Scheduler und das, was @20skui09 schon gesagt hat.
Genau so hab ich dass ja gemeint :D
ich kenne eigentlich nicht den Unterschied. ich habe doch einen countdown laufen wo es jede 1/2 sekunde überprüft, ob eine verbindung läuft. wenn nicht dann verbindet es sich
die frage ist ob die connection nach der fehlermeldung NULL wird..

hat jemand eine idee wie man das fixen kann? oben ist der link zum Fehlermeldung. ?autoReconnect=true hilft nicht
 
die abfrage läuft asynchron also durch runTaskTimerAsynchronous und ich benutze auch thread sleep..
also müsste das mit ressourcensparend halb so schlimm sein. glaube ich.



ich kenne eigentlich nicht den Unterschied. ich habe doch einen countdown laufen wo es jede 1/2 sekunde überprüft, ob eine verbindung läuft. wenn nicht dann verbindet es sich
die frage ist ob die connection nach der fehlermeldung NULL wird..

hat jemand eine idee wie man das fixen kann? oben ist der link zum Fehlermeldung. ?autoReconnect=true hilft nicht
Ich hab mal ein bisschen gegoogelt, die Connection wird nicht null sondern nur vom mysql Server geschlossen. Google sagt zum überprüfen der Connection einfach "SELECT 1" an den mysql Server schicken, wenn du eine Antwort bekommst ist die Connection in Ordnung, wenn nicht dann nicht (ich kann gerade kein Code Beispiel Posten, bin nur am Handy online)
 
Ich habe hier eine meine MySQL Klasse: http://hastebin.com/zezoxogiva.java
In meiner BanManager Klasse gibt es auch keine Fehler: http://hastebin.com/ehabatogan.java
Wenn ich jedoch im onEnable Teil, die Methoden getReason, getEnd und getBannedPlayers teste, dann bekomme ich immer eine NulPointerExeption zurück, welche immer die Zeile von dem
Code:
while(rs.next()) {
}
angibt.
Ohne Stacktrace kann ich nur raten.. Außerdem gibst du bei getBannedPlayers immer null zurück
 
Hier ist der Stacktrace! Ich habe mal bei getEnd() und den anderen ein return getEnd(uuid); bzw. halt getReason() und so weiter gemacht. Ohne Erfolg.
Code:
[14:31:53] [Server thread/ERROR]: Error occurred while enabling BanManager v1.0 (Is it up to date?)
java.lang.NullPointerException
    at de.redstoneraudi.banmanager.util.BanManager.getEnd(BanManager.java:64) ~[?:?]
    at de.redstoneraudi.banmanager.main.Main.onEnable(Main.java:31) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321) ~[spigot_server.jar:git-Spigot-2f787bd-1a1bc08]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:335) [spigot_server.jar:git-Spigot-2f787bd-1a1bc08]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigot_server.jar:git-Spigot-2f787bd-1a1bc08]
    at org.bukkit.craftbukkit.v1_8_R2.CraftServer.loadPlugin(CraftServer.java:356) [spigot_server.jar:git-Spigot-2f787bd-1a1bc08]
    at org.bukkit.craftbukkit.v1_8_R2.CraftServer.enablePlugins(CraftServer.java:316) [spigot_server.jar:git-Spigot-2f787bd-1a1bc08]
    at net.minecraft.server.v1_8_R2.MinecraftServer.r(MinecraftServer.java:416) [spigot_server.jar:git-Spigot-2f787bd-1a1bc08]
    at net.minecraft.server.v1_8_R2.MinecraftServer.k(MinecraftServer.java:382) [spigot_server.jar:git-Spigot-2f787bd-1a1bc08]
    at net.minecraft.server.v1_8_R2.MinecraftServer.a(MinecraftServer.java:337) [spigot_server.jar:git-Spigot-2f787bd-1a1bc08]
    at net.minecraft.server.v1_8_R2.DedicatedServer.init(DedicatedServer.java:257) [spigot_server.jar:git-Spigot-2f787bd-1a1bc08]
    at net.minecraft.server.v1_8_R2.MinecraftServer.run(MinecraftServer.java:522) [spigot_server.jar:git-Spigot-2f787bd-1a1bc08]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_45]
[14:31:53] [Server thread/INFO]: Server permissions file permissions.yml is empty, ignoring it
[14:31:53] [Server thread/INFO]: Done (18,660s)! For help, type "help" or "?"
 
Ich hätte mal eine kurze Frage:

Wann tritt das InventoryCloseEvent ein. Also schon Klar, wenn man ein Inventar schließt. Tritt es auch beim:
Server Verlassen,
Spieler wird gekickt,
Mc crasht,
Server crasht,
Spieler Teleportiert (andere Welten / Server).

Kann mir wer sagen ob es bei den aufgezählten Punkten das Event passiert?
 
Ich hätte mal eine kurze Frage:

Wann tritt das InventoryCloseEvent ein. Also schon Klar, wenn man ein Inventar schließt. Tritt es auch beim:
Server Verlassen,
Spieler wird gekickt,
Mc crasht,
Server crasht,
Spieler Teleportiert (andere Welten / Server).

Kann mir wer sagen ob es bei den aufgezählten Punkten das Event passiert?
Probier es doch aus._.? Machste ne debugg message und testest es mal. Und schaust inner Console ob die Nachricht kam ._.

-DevelRico am Handy.
 
Ich möchte ein Befehl erstellen: /plus <Zahl 1> <Zahl 2>
also: /plus 2 3
Als Antwort käme dann: Das Ergebnis ist 5
Allerdings kann ich keinen Integer erstellen, dessen Wert args[1]/args[2] ist. Wie soll ich das am besten regeln?
 
Ich möchte ein Befehl erstellen: /plus <Zahl 1> <Zahl 2>
also: /plus 2 3
Als Antwort käme dann: Das Ergebnis ist 5
Allerdings kann ich keinen Integer erstellen, dessen Wert args[1]/args[2] ist. Wie soll ich das am besten regeln?
Bitteschön:

Code:
if(cmd.getName().equalsIgnoreCase("plus")) {
            if(args.length != 2) {
                return true;
            }

            try {
                int x = Integer.parseInt(args[0]);
                int y = Integer.parseInt(args[1]);

                int end = x+y;
                sender.sendMessage("Zahl: "+end);
            } catch (NumberFormatException e) {
                sender.sendMessage("Kannst du mal Zahlen verwenden?");
            }

        }
 
Code:
if(args.length != 2) {
      return true;
}

Du solltest nicht true zurückgeben, ohne etwas anderes zu tun, da die boolean der success Wert des ausgeführten Befehls ist. Für den User bedeutet das: return false -> usage aus der plugin.yml wird angezeigt; return true -> Bukkit macht sichtbar nichts von alleine. D.h. return false sollte verwendet werden, wenn im Code keine andere (detailliertere) Fehlermeldung ausgegeben wird. return true nur, wenn der Command wie nach plan ablief ODER wenn ein Fehler aufgetreten ist, aber der User durch das Plugin selbst informiert wurde.

Letzteres ist z.B. meine Methode für Commands. Ich schreibe als usage in die plugin.yml "Something went horribly wrong...". Sobald ich diese Nachricht in-game sehe, weiß ich, dass ich einen bestimmten Grenzfall nicht abfange.

Mit freundlichen Grüßen
1Darco1
 
  • Like
Reaktionen: Dosenwerfer
Du solltest nicht true zurückgeben, ohne etwas anderes zu tun, da die boolean der success Wert des ausgeführten Befehls ist. Für den User bedeutet das: return false -> usage aus der plugin.yml wird angezeigt; return true -> Bukkit macht sichtbar nichts von alleine. D.h. return false sollte verwendet werden, wenn im Code keine andere (detailliertere) Fehlermeldung ausgegeben wird. return true nur, wenn der Command wie nach plan ablief ODER wenn ein Fehler aufgetreten ist, aber der User durch das Plugin selbst informiert wurde.

Letzteres ist z.B. meine Methode für Commands. Ich schreibe als usage in die plugin.yml "Something went horribly wrong...". Sobald ich diese Nachricht in-game sehe, weiß ich, dass ich einen bestimmten Grenzfall nicht abfange.

Mit freundlichen Grüßen
1Darco1
Ich benutze generell nie Usages, weil ich sowas unnötig finde. Außerdem ist der Befehl zum Testen da. Falls er den Befehl wirklich braucht, kann er ja bei der Abfrage selbst etwas draufpacken.
 
Ich habe hier eine meine MySQL Klasse: http://hastebin.com/zezoxogiva.java
In meiner BanManager Klasse gibt es auch keine Fehler: http://hastebin.com/ehabatogan.java
Wenn ich jedoch im onEnable Teil, die Methoden getReason, getEnd und getBannedPlayers teste, dann bekomme ich immer eine NulPointerExeption zurück, welche immer die Zeile von dem
Code:
while(rs.next()) {
}
angibt.

Naja, das heißt, dass deine Variable rs null ist, was bedeutet, dass isConnected() false zurückgibt, was bedeutet, dass die Variable con in der MySQL Klasse null ist. (Wäre con != null, müsste noch eine andere Exception aufgetreten sein damit rs null wird, und davon hast du nicht berichtet, also gehe ich davon aus, dass der try/catch Block nicht ausgeführt wird.) Hast du denn die "Connection" im onEnable Teil vor dem Aufrufen deiner Methoden initialisiert? Und wenn ja, lief dies fehlerfrei ab?
 
Bitteschön:

Code:
if(cmd.getName().equalsIgnoreCase("plus")) {
            if(args.length != 2) {
                return true;
            }

            try {
                int x = Integer.parseInt(args[0]);
                int y = Integer.parseInt(args[1]);

                int end = x+y;
                sender.sendMessage("Zahl: "+end);
            } catch (NumberFormatException e) {
                sender.sendMessage("Kannst du mal Zahlen verwenden?");
            }

        }
Ohne try-catch Block:
Code:
if(NumberUtils.isNumber(arg) {
  //Berechnen
} else {
  p.sendMessage("Seit wann ist \"" + arg + "\" eine Zahl?");
}
 
Ich benutze generell nie Usages, weil ich sowas unnötig finde. Außerdem ist der Befehl zum Testen da. Falls er den Befehl wirklich braucht, kann er ja bei der Abfrage selbst etwas draufpacken.

Eigentlich ja ein super Shortcut für Fälle, in denen etwas nicht passt. Man hat halt nur nicht sehr viele Möglichkeiten mit den usage messages.
 
  • Like
Reaktionen: Dosenwerfer
Ich möchte ein Befehl erstellen: /plus <Zahl 1> <Zahl 2>
also: /plus 2 3
Als Antwort käme dann: Das Ergebnis ist 5
Allerdings kann ich keinen Integer erstellen, dessen Wert args[1]/args[2] ist. Wie soll ich das am besten regeln?
Man sollte hier eventuell noch erwähnen, dass man beim Programmieren stets mit 0 zum Zählen anfängt. Hat man z.B. eine Liste mit den Elementen [a, b, c, d, e], dann ist das 1. Element eben b und das 0. Element a.
Beim Command geht das ganze analog: /bspCommand a b c; Dann ist args[0] = a und args[1] = b.
Das sollte man sich immer merken, sonst kommen schnell Fehler auf. ;)
Integer kann man wie gesagt mit Integer.parseInt(String) oder auch Integer.valueOf(String) erzeugen, welche aber beide in der Regel das gleiche tun.

PS: Was soll den so schlimm sein, wenn man so etwas nachfragt? Auch wenn das jetzt in der Javainsel auf Seite drölfhundert genau steht, wie man derartiges tut, heißt das doch nicht, dass man das jetzt unbedingt wissen soll, vor allem, wenn man so etwas noch nicht getan hat. Da sind englische Foren wie Stackoverflow viel ehrlicher, netter und bringen eine erklärte, vernünftige Antwort. Wenn man einen Code postet, ist das schön und gut, eine Erklärung sollte allerdings nicht fehlen.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: RedstoneRaudi
Status
Für weitere Antworten geschlossen.

Soziale Medien

  • X
  • TikTok

Über uns

  • GommeHD.net ist einer der größten Minecraft-Server der Welt. Dir gefällt unser Server? Dann unterstütze uns durch einen Kauf im Shop!
  • Shop