【问题标题】:StackOverflowError in UncaughtExceptionHandlerUncaughtExceptionHandler 中的 StackOverflowError
【发布时间】:2015-03-13 12:44:42
【问题描述】:

我已经实现了一个未捕获的异常处理程序来捕获未捕获的异常。但有时或在某些设备中,此处理程序因java.lang.StackOverflowError 而失败。这是异常的logcat:

java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:121)
at java.lang.StringBuffer.append(StringBuffer.java:278)
at java.io.StringWriter.write(StringWriter.java:123)
at com.android.internal.util.FastPrintWriter.flushLocked(FastPrintWriter.java:358)
at com.android.internal.util.FastPrintWriter.appendLocked(FastPrintWriter.java:303)
at com.android.internal.util.FastPrintWriter.write(FastPrintWriter.java:625)
at com.android.internal.util.FastPrintWriter.append(FastPrintWriter.java:658)
at java.io.PrintWriter.append(PrintWriter.java:691)
at java.io.PrintWriter.append(PrintWriter.java:31)
at java.lang.Throwable.printStackTrace(Throwable.java:324)
at java.lang.Throwable.printStackTrace(Throwable.java:300)
at android.util.Log.getStackTraceString(Log.java:459)
at com.example.src.CustomExceptionHandler.uncaughtException(CustomExceptionHandler.java:36)
at com.example.src.CustomExceptionHandler.uncaughtException(CustomExceptionHandler.java:41)
at com.example.src.CustomExceptionHandler.uncaughtException(CustomExceptionHandler.java:41)

以及根据堆栈跟踪导致错误defaultUEH.uncaughtException(t, e); 的行。

完整的代码是:

import java.lang.Thread.UncaughtExceptionHandler;
import android.util.Log;

class CustomExceptionHandler implements UncaughtExceptionHandler {

private UncaughtExceptionHandler defaultUEH;

protected CustomExceptionHandler() {
    try
    {
        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    }
    catch(Exception e)
    {
        System.out.println("Exception: "+e);
    }
}

public void uncaughtException(Thread t, Throwable e) {
    try
    {
        String stacktrace = Log.getStackTraceString(e);

        SendStackTraceToServer sendStackTraceToServer = new SendStackTraceToServer();
        sendStackTraceToServer.startThreadToSendRequest(stacktrace);

        defaultUEH.uncaughtException(t, e); // this line cause stackoverflow error.
    }
    catch(Exception ex)
    {
        System.out.println("Exception: "+ex);
    }
}

protected static void setDefaultUncaughtExceptionHandler()
{
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler());
}
}

帮我解决这个问题。因为我无法重现此问题(或者我不知道如何重现此问题)。

【问题讨论】:

    标签: java android uncaughtexceptionhandler


    【解决方案1】:

    defaultUEH.uncaughtException(t, e);调用 defaultUEH.uncaughtException(t, e);调用 defaultUEH.uncaughtException(t, e); ...最后你得到 StackOverflowError。

    可能是我不对,但我认为您的代码很复杂。

    我建议像这样使用 Handler:

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            String stacktrace = Log.getStackTraceString(e);
            SendStackTraceToServer sendStackTraceToServer = new SendStackTraceToServer();
            sendStackTraceToServer.startThreadToSendRequest(stacktrace);
        }
    });
    

    【讨论】:

    • 如果我删除了“defaultUEH.uncaughtException(t, e);”从函数开始,当发生任何未捕获的异常时,我的应用程序就会挂起。有什么想法吗?
    • @DevK 我不明白你的问题。你想做什么?
    【解决方案2】:

    java.lang.StackOverflowError 是错误而不是异常

    http://docs.oracle.com/javase/7/docs/api/java/lang/StackOverflowError.html

    如果你需要捕获所有“throwable”,你可以捕获 Throwable

    【讨论】:

    • 无论如何,抓住它是个坏主意
    • 好的。你知道为什么“UncaughtExceptionHandler”会在 defaultUEH.uncaughtException(t, e); 行导致 stackoverflow 错误。应用递归太深是什么原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多