2015-01-15 6 views
-1

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()); 
} 
} 

도움말 내가이 문제를 해결한다. 이 문제를 재현 할 수 없기 때문에 (또는이 문제를 재현하는 방법을 모르겠습니다.)

답변

0

java.lang.StackOverflowError의 오류없는 예외입니다

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

모든 "throw 가능 객체"

+0

것은 어쨌든 – Vitaly

+0

OK를 잡을 수있는 좋은 생각이다. "UncaughtExceptionHandler"가 defaultueH.uncaughtException (t, e); 행에서 stackoverflow 오류를 발생시키는 이유를 알고 있습니까? 응용 프로그램 재발의 이유가 너무 깊습니다. – DevK

0

defaultUEH.uncaughtException (t, e)를 잡을해야하는 경우가 Throwable를 잡을 수 있습니다; defaultUEH.uncaughtException (t, e)를 호출합니다. defaultUEH.uncaughtException (t, e)를 호출합니다. ... 결국 StackOverflowError가 발생합니다.

내가 맞을지 모르지만 코드가 복잡하다고 생각합니다.

나는 다음과 같이 사용 처리기 추천 :

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); 
    } 
}); 
+0

"defaultUEH.uncaughtException (t, e);"를 제거한 경우 " 함수에서 catch되지 않은 예외가 발생할 때 내 응용 프로그램이 중단되었습니다. 어떤 생각? – DevK

+0

@DevK 질문이 이해가 가지 않습니다. 당신은 무엇을하길 원합니까? – DmitryKanunnikoff