Java缓冲编写器不会写入所有数据

and*_*070 1 java for-loop bufferedwriter

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) {}
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,在库存系统的for循环之后,没有其他东西被写入文件.所以在这个例子中,AttributeSystem.attributeValues没有写入.我也尝试过在这个循环之后编写其他东西,包括非循环的东西,他们也没有写.Whagwaan?

Jon*_*eet 7

这就是问题:

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

<=应该是一个<.因此,如果集合中有5个项目,那么您需要元素5,这是第6个元素,因为索引是从0开始的.这将抛出异常.

然后被这掩盖了:

catch (Throwable e)
{
}
Run Code Online (Sandbox Code Playgroud)

在诊断方面,你完全在这里完成了自己的工作:

  • 除非你能真正处理异常,否则不要抓住它 - 或抓住它然后在记录之后重新抛出它(或者其他)
  • 尽可能捕获特定的例外情况.(捕捉Exception很糟糕;捕捉Throwable更糟糕.)
  • 没有记录的情况下默默地捕捉是一个糟糕的主意.这意味着你不知道你有多长时间遇到问题,或者它们是什么.

(另外,代码建议你要么过度使用静态变量,要么需要整理你的命名约定.但这是另一回事.)