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

問題は、RTE を投げた後、 に入らないことUncaughtExceptionHandlerです。なんで?

ところで、私の Android プログラムにはメインがないため、メイン メソッドに入れることはできません。

4

2 に答える 2

1

Application クラスをサブクラス化し、 ExceptionHandlerinonCreate()メソッドを初期化できます。

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();
于 2013-01-10T09:59:05.033 に答える
0

初期化ブロックはstatic、ClassLoader によってクラスがロードされたときにのみ実行されます。私は Android の専門家ではありませんが、メイン アクティビティ クラスで例外ハンドラを初期化できると思います。ここにあるような静的初期化ブロックを使用するか、のActivityようなライフサイクルメソッドを使用してくださいonCreate。この種の初期化に最適な可能性があるLeonidosによってここで提案された別のオプションもあります: を拡張し、Application classそこにコードを配置します。

于 2013-01-10T09:59:37.613 に答える