我编写了一个需要处理数千个文本文件的java程序(都需要加载到内存中)。它可以使用多达123个输入文件,但是当我运行它来处理大约5000个文件时,它会在路中间意外终止,而不会给出任何错误消息/异常。谁能给我一些可能出错的线索?
我在拥有2GB内存的Mac OS Leopard上使用jdk1.6。
答案 0 :(得分:4)
鉴于这是您的计划,我建议您执行以下操作:
首先,更改main
方法,以便在try / catch块中完成所有操作,该块报告所有未捕获的异常;例如像这样的东西:
public static void main(String[] arghhhhh) {
try {
...
} catch (Throwable ex) {
System.err.println("Uncaught exception - " + ex.getMessage());
ex.printStackTrace(System.err);
}
}
其次,寻找可以通过捕获它们而不报告它们来“挤压”意外异常的任何地方。
第三,寻找你可以默默呼叫System.exit()
的任何地方。这也可能发生在图书馆......如果你使用的是写得不好的。
如果这些措施没有给出答案,请尝试通过
计算应用程序如何退出答案 1 :(得分:3)
好像你要OutofmemoryError
。
如果是这种情况,请尝试增加堆内存大小。
java -Xms<initial heap size> -Xmx<maximum heap size>
答案 2 :(得分:2)
您是否同时打开文件?如果一次加载太多文件,则可能内存不足。如果文件足够大,则可能只有一个文件打开时内存不足。此外,请确保在完成文件后关闭文件。
答案 3 :(得分:1)
检查是否有任何未正确记录异常的try / catch块。
很可能是OutofmemoryError。确保未重定向控制台。
答案 4 :(得分:1)
主要有两个原因。
要处理这些情况,请考虑执行以下步骤:
确保处理起始Java堆栈帧中的所有异常,即Main-method:
尝试{ ..码 } catch(Throwable t){ t.printStackTrace }
确保您可以控制stdout和stderr所在的位置。您可以以编程方式将这些设置为具体文件:
System.setOut(new PrintStream(“output.txt”)); System.setErr(new PrintStream(“err.txt”));