catch되지 않는 예외를 catch하기 위해 catch되지 않는 예외 처리기를 구현했습니다. 그러나 일부 기기 또는 일부 기기에서는이 핸들러가 java.lang.StackOverflowError
으로 실패했습니다. 스택 트레이스에 따른 오차가 발생할 defaultUEH.uncaughtException(t, e);
UncaughtExceptionHandler의 StackOverflowError
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)
및 배선 : 여기서 로그 캣 예외이다.
그리고 전체 코드는 다음과 같습니다
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());
}
}
도움말 내가이 문제를 해결한다. 이 문제를 재현 할 수 없기 때문에 (또는이 문제를 재현하는 방법을 모르겠습니다.)
것은 어쨌든 – Vitaly
OK를 잡을 수있는 좋은 생각이다. "UncaughtExceptionHandler"가 defaultueH.uncaughtException (t, e); 행에서 stackoverflow 오류를 발생시키는 이유를 알고 있습니까? 응용 프로그램 재발의 이유가 너무 깊습니다. – DevK