5

我在 LogCat 中收到OutOfMemoryError消息,我的应用程序崩溃了,因为错误未被捕获。

有两件事导致OutOfMemoryError
1. 将大文本文件读入字符串。
2. 将该字符串发送到我的 TextView。

简单地在这两件事上添加一个 catch 不仅可以捕获OutOfMemoryError,而且似乎可以完全解决内存不足的问题。
LogCat 中不再出现崩溃和错误消息。该应用程序运行完美。

这怎么可能?到底发生了什么?


使用此代码,我收到错误消息和应用程序崩溃:

try
{
myString = new Scanner(new File(myFilePath)).useDelimiter("\\A").next();
} 
catch (FileNotFoundException e) 
{
e.printStackTrace();
}


myTextView.setText(myString);



只需“捕获” OutOfMemoryError,LogCat 中就不会再出现错误消息并且不会崩溃:

try
{
myString = new Scanner(new File(myFilePath)).useDelimiter("\\A").next();
} 
catch (FileNotFoundException e) 
{
e.printStackTrace();
}
catch(OutOfMemoryError e)
{
}


try 
{
myTextView.setText(myString);
} 
catch(OutOfMemoryError e)
{
}
4

3 回答 3

2

我猜你的字符串没有完全加载,或者即使它是(它可能会在添加文本后抛出错误),发生的事情取决于你的应用程序可用的当前内存,所以OutOfMemoryError在这里捕获不是一个可行的解决方案。

如果你真的想加载一个大的字符串文件并在EditText. 您还可以在用户滚动浏览EditText.

于 2013-06-22T13:09:00.353 回答
1

当您捕获异常时,JVM 会尝试通过调用垃圾收集器并抓取不再使用的对象来从中恢复。

这可能会解决您的问题。但是想象一下,问题是由于代码中的错误编码和内存泄漏而出现的。捕获不会解决问题,因为 GC 不会收集任何对象。GC 将更频繁地启动,您的应用程序的性能将下降,直到它变得不可用。

基本上,当 JVM 无法在堆上为新对象分配更多内存时,就会发生此错误。捕获异常并让 GC 清理和释放内存可能是一种解决方案,但您永远不能绝对确定自己处于可恢复状态。我会使用 catch 块从错误中恢复,记录它并关闭应用程序。如果您想解决这种情况下的内存问题,请正确执行并使用更多内存初始化 JVM(使用 java 参数-Xmx

于 2013-06-22T13:10:15.230 回答
1

如果您捕获 OutOfMemoryError,垃圾收集器会尝试释放先前使用的内存,因此如果应用程序让垃圾收集器完成其工作(即应用程序不再引用您的那个大字符串),应用程序可以继续)。

然而,捕获 OutOfMemoryError 远非万无一失。请参阅捕获 java.lang.OutOfMemoryError?.

于 2013-06-22T13:07:32.690 回答