【问题标题】:java.lang.OutOfMemoryError how to fix thisjava.lang.OutOfMemoryError 如何解决这个问题
【发布时间】:2012-01-22 10:32:43
【问题描述】:

我找到了一个代码,但有时会出错:

StringBuilder strHeaders = new StringBuilder();
char c;
while ((c = (char)stream.read()) != -1) {
    strHeaders.append(c);
    if (strHeaders.length() > 5 && (strHeaders.substring((strHeaders.length() - 4), strHeaders.length()).equals("\r\n\r\n"))) {
        // end of headers
        break;
    }
}

日志猫

java.lang.OutOfMemoryError
    at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
    at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:140)
    at java.lang.StringBuilder.append(StringBuilder.java:125)
    at myApp.activity.com.getFromPLS.retreiveMetadata(getFromPLS.java:98)
    at myApp.activity.com.getFromPLS.refreshMeta(getFromPLS.java:76)
    at myApp.activity.com.myApp$1.run(myApp.java:371)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3683)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)

这一行出错

strHeaders.append(c);

请谁能帮我解决这个问题?

【问题讨论】:

    标签: android


    【解决方案1】:

    由于char 是无符号类型,因此您的while 循环条件将永远不会满足,即使在stream.read() 开始返回-1 之后也是如此。如果找不到"\r\n\r\n" 序列,则循环将永远不会结束。像这样编写循环:

    StringBuilder strHeaders = new StringBuilder();
    int c;
    while ((c = stream.read()) != -1) { // DO NOT cast to char here!
        strHeaders.append((char) c);
        final int len = strHeaders.length();
        if (len > 5 && (strHeaders.substring(len - 4)).equals("\r\n\r\n"))) {
            // end of headers
            break;
        }
    }
    

    请注意,许多服务器会错误地将"\n\n" 作为表示标头结束的空白行返回。有些人还可能返回"\r\r"。除非您控制服务器输出并保证它会看到"\r\n\r\n",否则您的空行检测方法需要以更健壮的方式编写。

    【讨论】:

      【解决方案2】:

      这与您正在阅读的文件有关。如果文件很大,那么您将遇到此问题。最好的办法是检查文件大小并将其传送到更小的块中。您在 StringBuffer 中放入的数据越多,您的内存就会越多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-01
        • 2014-10-07
        • 1970-01-01
        • 2013-06-20
        • 2019-04-20
        • 2011-06-07
        相关资源
        最近更新 更多