2016-10-28 10 views
-5

私はSpigotプラグインを作成していますが、このコードはサーバーをクラッシュさせています。日付の解析操作がクラッシュするサーバ

public List<String> getReports(OfflinePlayer p) { 
    FileConfiguration config = getData(p); 
    List<String> reports = new ArrayList<String>(); 
    for (String item : config.getConfigurationSection("reports").getKeys(false)) { 
     try { 
      Date created = dateFormat.parse(config.getString("reports." + item + ".date")); 
      if (!reports.isEmpty()) { 
       boolean added = false; 
       for (int i = 0; i < reports.size(); i++) { 
        try { 
         String e = reports.get(i); 
         String edate = config.getString("reports." + e + ".date"); 
         Date eday = dateFormat.parse(edate); 
         if (created.after(eday) || created.equals(eday)) { 
          reports.add(i, item); 
          added = true; 
         } 
        } catch (Throwable e) { 
         e.printStackTrace(); 
        } 
       } 
       if (!added) { 
        reports.add(item); 
       } 
      } else { 
       reports.add(item); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    return reports; 
} 

無効な日付文字列はParseExceptionをスローしますが、エラーはスローされません。私はThrowableを捕まえようとしましたが、それは何もしませんでした。文字列は有効で、私のプラグインで正しくインポートされています(チェックしました)。このメソッドは1-2個の項目で機能しますが、何らかの理由でそれ以上のものが壊れてしまいます。

はここにある私のデータ(YAML):

メソッドが何しようとしている何
reports: 
    '1': 
    type: Misc 
    source: 6db6fde9-802f-4bef-a40a-fe516a7a8309 
    reason: Idk 
    date: 28/10/2016 19:09:16 
    '2': 
    type: Grief 
    source: 6db6fde9-802f-4bef-a40a-fe516a7a8309 
    reason: He destroyed my building! And he did really nasty stuff too meh, ban him now! 
    date: 28/10/2016 19:14:56 
    '3': 
    type: Hacking 
    source: 6db6fde9-802f-4bef-a40a-fe516a7a8309 
    reason: He was flying like mad all over the place. This guy needs to be banned! 
    date: 28/10/2016 19:29:33 

、プレイヤーの履歴からデータをインポートし、新しいものから順に、それを並べ替えます。私はこれまでに起こったような何かを見たことがない、それが起こるような何かのために文書化されていない。私は本当にばかなことをしなければならないことを知っていますが、それが何であるかを知るためには助けが必要です。

編集:ここでは は私のDATEFORMATフェイルドある

public final DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.US); 

編集:私はすでに具体的なエラーがスローされなかったと述べていますが、ここで助け

[10:08:18] [Spigot Watchdog Thread/ERROR]: The server has stopped responding! 
[10:08:18] [Spigot Watchdog Thread/ERROR]: Please report this to http://www.spigotmc.org/ 
[10:08:18] [Spigot Watchdog Thread/ERROR]: Be sure to include ALL relevant console errors and Minecraft crash reports 
[10:08:18] [Spigot Watchdog Thread/ERROR]: Spigot version: git-Spigot-5f38d38-18fbb24 (MC: 1.8.8) 
[10:08:18] [Spigot Watchdog Thread/ERROR]: ------------------------------ 
[10:08:18] [Spigot Watchdog Thread/ERROR]: Server thread dump (Look for plugins here before reporting to Spigot!): 
[10:08:18] [Spigot Watchdog Thread/ERROR]: ------------------------------ 
[10:08:18] [Spigot Watchdog Thread/ERROR]: Current Thread: Server thread 
[10:08:18] [Spigot Watchdog Thread/ERROR]: PID: 16 | Suspended: false | Native: false | State: RUNNABLE 
[10:08:18] [Spigot Watchdog Thread/ERROR]: Stack: 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  java.text.DecimalFormat.parse(Unknown Source) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  java.text.SimpleDateFormat.subParse(Unknown Source) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  java.text.SimpleDateFormat.parse(Unknown Source) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  java.text.DateFormat.parse(Unknown Source) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  com.rictacius.punishSystem.system.History.getReports(History.java:155) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  com.rictacius.punishSystem.gui.PunishMenu.getReportsBar(PunishMenu.java:57) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  com.rictacius.punishSystem.gui.PunishMenu.getMainMenu(PunishMenu.java:41) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  com.rictacius.punishSystem.command.PunishCommand.onCommand(PunishCommand.java:62) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1162) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:997) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  java.util.concurrent.FutureTask.run(Unknown Source) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) 
[10:08:18] [Spigot Watchdog Thread/ERROR]:  java.lang.Thread.run(Unknown Source) 

最後の項目ではdoesntのスタックトレースがあります私と関係のあるスタックはこの行です

日付eday = dateFormat.parse(edate);

+0

エラーはどういうものですか? – Kerooker

+0

私は何かエラーが発生していない、それは問題です。サーバーがクラッシュするだけです。私はちょうど何かエラーが発生したことを私に言っている見出しなしで、スタックトレースを取得します。スタックの一番上は_Date eday = dateFormat.parse(edate); _ –

+1

のようになります。 'Date created = dateFormat.parse(config.getString(" + item + ".date")をレポートします));例外。あなたがそれを解析しようとしていたものを印刷しましたか?あるいは、それは 'Date eday = dateFormat.parse(edate);'ですか? – Tunaki

答えて

2

私のサーバーがクラッシュする理由は、メモリ不足のためです。

(From:@Jon Skeet)コレクションをループして条件付きで追加しているという事実は私には疑わしいです。アイテムを追加してからそのアイテムを見つけて別のアイテムを追加し、別のアイテムを追加するなど、永遠にループする可能性があります。スタックトレースは無限ループ内で実行されたものか、メモリ不足。コードがどのように実行されているかを確認できるように、より多くの診断を追加する必要があります。

私が値を追加しているコレクションをループすることは正しくありません。何が起こるのかということは、オブジェクトが同じ位置に永久に追加され続けるからです。

代わりに、配列を移入した後に配列をソートする必要があります。シンプルなシャトルソートではこれが修正されました。