Java未捕获异常处理程序不起作用。

3

我有一个全局的异常处理程序,它会将一些异常包装成运行时异常。

就像这样:

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

问题是,抛出运行时异常后,它没有进入UncaughtExceptionHandler。为什么?
顺便说一下,我不能将它放入主方法中,因为我的Android程序中没有主方法。

请看这里:在Android中设置全局未捕获异常处理程序的理想方式是什么? - linski
我认为静态块中的代码没有被执行,因为ExceptionHandler没有被初始化,因为没有人使用ExceptionHandler类。阅读此帖子。您可以扩展Android的Application类并将此代码放置在那里,Application类的构造函数是“main”函数的某种类比。 - Leonidos
2个回答

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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接