如何在android上使用UnHandledExceptionHandler?

时间:2016-08-04 08:04:55

标签: android

最近,当我断开设备上的相机时。发生nullpointerException

所以,我认为使用UnhandledExceptionHandler

我试试这个,首先不要发生nullpointerException

但app无法启动。 我想要没有相机设备,应用程序执行良好。

MainActivity.class

@Override
protected void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);

    String nameOfFrontFacingDevice = VideoCapturerAndroid.getNameOfFrontFacingDevice();

    VideoCapturerAndroid capturer = VideoCapturerAndroid.create(nameOfFrontFacingDevice);
    if (capturer == null || capturer.equals("") == true) {
      Thread.setDefaultUncaughtExceptionHandler(new UnhandledExceptionHandler(this));
        throw new NullPointerException();

    }

UnhandledExceptionHandler.class

public class UnhandledExceptionHandler implements Thread.UncaughtExceptionHandler {
private static final String TAG = "UnUnHandler";
private final Activity activity;

public UnhandledExceptionHandler(final Activity activity) {
    this.activity = activity;
}

public void uncaughtException(Thread unusedThread, final Throwable e) {
    activity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            String title = "Fatal error: " + getTopLevelCauseMessage(e);
            String msg = getRecursiveStackTrace(e);
            TextView errorView = new TextView(UnhandledExceptionHandler.this.activity);
            errorView.setText(msg);
            errorView.setTextSize(2, 8.0F);

            ScrollView scrollingContainer = new ScrollView(UnhandledExceptionHandler.this.activity);
            scrollingContainer.addView(errorView);


            OnClickListener listner = new OnClickListener(){

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    System.exit(1);
                }
            };


            Builder builder = new Builder(UnhandledExceptionHandler.this.activity);
            builder.setTitle(title).setView(scrollingContainer).setPositiveButton("Exit", listner).show();
        }
    });
}

private static String getTopLevelCauseMessage(Throwable t) {
    Throwable topLevelCause = t;
    while (topLevelCause.getCause() != null) {
        topLevelCause = topLevelCause.getCause();
    }
    return topLevelCause.getMessage();

}

private static String getRecursiveStackTrace(Throwable t) {
    StringWriter writer = new StringWriter();
    t.printStackTrace(new PrintWriter(writer));
    return writer.toString();
}



        }

这不显示对话框。 如何使用UnhandledExceptionHandler?

1 个答案:

答案 0 :(得分:0)

未捕获的异常处理程序应该仅在最坏的情况下使用,此时每个其他机制都会失败。要处理NullPointerException,您应该将其放在 try catch 块中。

我建议您首先查看Java中的异常处理。

UncaughtException handler-意味着发生了一些意外错误,并且不允许应用程序崩溃会导致结果不稳定。

仅用于报告或记录意外异常,而不是防范异常。这显示了App设计中的一个缺陷。

如果您仍计划使用UncaughtExceptionHandler,因为您不太了解Java的工作原理,我建议您使用其他第三方服务为您执行此操作..

例如---> Crashlytics (它有一个内置的默认异常处理程序,并在发生崩溃时报告崩溃)或 ACRA 等....