【问题标题】:Java uncaughtExceptionHandler not workingJava uncaughtExceptionHandler 不起作用
【发布时间】:2013-01-10 09:49:54
【问题描述】:

我有一个全局异常处理程序例程,它将一些异常包装在运行时异常中

这样

public class ExceptionHandler
{
public static void handle(){
    throw new RuntimeException(e);
}
}

ExceptionHandler 类中,我还有一个静态构造函数

static
  {
    Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler()
    {
      @Override
      public void uncaughtException(Thread thread, Throwable throwable)
      {
        Throwable t;
        t = throwable;
        if (throwable.getCause() != null)
          t = throwable.getCause();
        Log.e(t.getClass().getName(), t.getMessage(), t);
      }
    };
    Thread.currentThread().setUncaughtExceptionHandler(h);
    Thread.setDefaultUncaughtExceptionHandler(h);
  }

问题是,在抛出 RTE 后,它不会进入 UncaughtExceptionHandler。为什么?

顺便说一句,我不能把它放到 main 方法中,因为我的 Android 程序中没有 main。

【问题讨论】:

  • here
  • 我认为静态块中的代码没有被执行,因为没有人使用 ExceptionHandler 类,所以没有启动 ExceptionHandler。 read this post。您可以扩展 android 的 Application 类并将此代码放在那里,Application 类的构造函数是“main”函数的某种模拟。

标签: java android exception runtimeexception uncaughtexceptionhandler


【解决方案1】:

您可以继承 Application 类并在 onCreate() 方法中初始化您的 ExceptionHandler

public class YourApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());
    }
}

并在那里实现您的异常处理程序

private class ExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread thread, Throwable throwable) {
        processUncaughtException(thread, throwable);
    }
}

您可能还想维护默认的异常处理程序,以便在设置之前进行处理

defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();

【讨论】:

    【解决方案2】:

    static 初始化程序块仅在 ClassLoader 加载类时执行。我不是 Android 专家,但我认为您可以在主活动类中初始化异常处理程序。只需像这里一样使用静态初始化块或使用Activity 生命周期方法,如onCreateLeonidos 在这里还建议了另一个选项,这可能最适合这种初始化:扩展 Application class 并将您的代码放在那里。

    【讨论】:

      猜你喜欢
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 2017-08-26
      相关资源
      最近更新 更多