1
public static void save() 
{
    BufferedWriter out = null;
    try 
    {
        out = new BufferedWriter(new OutputStreamWriter(Gdx.files.external(file).write(false)));
        out.write(Double.toString(FinanceSystem.currentPlayerCash));
        out.write("\n");
        out.write(Integer.toString(DateSystem.day));
        out.write("\n");
        out.write(Integer.toString(DateSystem.month));
        out.write("\n");
        out.write(Integer.toString(DateSystem.year));
        out.write("\n");
        for(int i = 0; i <= InventorySystem.drugsOwned.size(); i++)
            out.write(Integer.toString(InventorySystem.drugsOwned.get(i))+"\n");
        for(int i = 0; i <= AttributeSystem.attributeNames.length; i++)
            out.write(Integer.toString(AttributeSystem.attributeValues.get(i)) + "\n");



    } 
    catch (Throwable e) {} 
    finally 
    {
       try
       {
          if (out != null)
               out.close();
       } 
       catch (IOException e) {}
    }

私の問題は、inventory system.drugsownedのforループの後、他に何もファイルに書き込まれないことです。したがって、この例では、AttributeSystem.attributeValuesは書き込まれません。私はまた、このループの後に、ループ以外のものを含む他の書き込みを入れようとしましたが、それらも書き込みをしていません。ワグワーン?

4

1 に答える 1

7

これが問題です:

for(int i = 0; i <= InventorySystem.drugsOwned.size(); i++)
    out.write(Integer.toString(InventorySystem.drugsOwned.get(i))+"\n");

<=である必要があり<ます。したがって、コレクションに 5 つの項目がある場合、要素 5 を要求しています。これは、インデックスが 0 ベースであるため、 6 番目の要素です。それは例外をスローします。

次に、これによってマスクされます。

catch (Throwable e)
{
}

診断に関しては、ここで完全に自分自身を悩ませています。

  • 例外を本当に処理できない場合は、例外をキャッチしないでください。または、キャッチしてからログ記録後に再スローします (または何でも)。
  • 可能な限り特定の例外をキャッチします。(キャッチExceptionは悪い、キャッチThrowableはもっと悪い。)
  • ロギングさえせずに黙ってキャッチするのはひどい考えです。つまり、問題がどのくらいの頻度で発生したか、または問題が何であったかがわからないということです。

(さらに、コードは、静的変数を使いすぎているか、命名規則を整理する必要があることを示唆しています。ただし、それは別の問題です。)

于 2012-01-06T19:52:38.600 に答える