最近,当我断开设备上的相机时。发生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?
答案 0 :(得分:0)
未捕获的异常处理程序应该仅在最坏的情况下使用,此时每个其他机制都会失败。要处理NullPointerException,您应该将其放在 try catch 块中。
我建议您首先查看Java中的异常处理。
UncaughtException handler-意味着发生了一些意外错误,并且不允许应用程序崩溃会导致结果不稳定。
仅用于报告或记录意外异常,而不是防范异常。这显示了App设计中的一个缺陷。
如果您仍计划使用UncaughtExceptionHandler,因为您不太了解Java的工作原理,我建议您使用其他第三方服务为您执行此操作..
例如---> Crashlytics (它有一个内置的默认异常处理程序,并在发生崩溃时报告崩溃)或 ACRA 等....