Androidで未キャプチャの例外をどう処理するか
(一)前言
プログラムに未レイヤキャプチャの例外が発生した場合、プログラム異常はどのように処理されますか?
(二)UncaughtExceptionHandlerインタフェース
このインタフェースは、その名の通り、処理プログラムに処理されていない異常であり、システムが異常を投げ出してプログラム異常が終了する前に行われます.では、Androidではどのように使いますか?
(三)UncaughtExceptionHandlerの使い方
1.まず、UncaughtExceptionHandlerの具体的なクラスを作成しなければなりません.たとえば、次のようにします.
クリップボードに内容をコピー
コード:
2.次に、アプリケーションクラスをカスタマイズします.
クリップボードに内容をコピー
コード:
3.AndroidManifestを配置する.xmlファイル
カスタマイズされたアプリケーションを使用しているので、Android Manifestにいます.xmlファイルに明記
クリップボードに内容をコピー
コード:
4.テスト
Activityでスレッドを起動し、スレッドに異常を投げ出してプログラムがどうなるか見てみましょう.
クリップボードに内容をコピー
コード:
5.結果
デフォルトで例外が処理されていないプロセッサがあるため、次のログ情報が印刷され、例外が放出されてプログラムが異常終了することはありません.
D/Sandy ( 2228): I am a sub thread
D/Sandy ( 2228): uncaughtException, thread: Thread[sub thread,5,main] name: sub thread id: 148exception: java.lang.NullPointerException
皆さんはまだ何を待っていますか?自分のアプリケーションにデフォルトの未処理例外プロセッサを追加しましょう.異常未捕獲でプログラムがクラッシュすることは二度とありません..^^;
プログラムに未レイヤキャプチャの例外が発生した場合、プログラム異常はどのように処理されますか?
(二)UncaughtExceptionHandlerインタフェース
このインタフェースは、その名の通り、処理プログラムに処理されていない異常であり、システムが異常を投げ出してプログラム異常が終了する前に行われます.では、Androidではどのように使いますか?
(三)UncaughtExceptionHandlerの使い方
1.まず、UncaughtExceptionHandlerの具体的なクラスを作成しなければなりません.たとえば、次のようにします.
クリップボードに内容をコピー
コード:
public class CrashHandler implements UncaughtExceptionHandler {
private static CrashHandler instance; // , , UncaughtExceptionHandler
private CrashHandler(){}
public synchronized static CrashHandler getInstance(){ // ,
if (instance == null){
instance = new CrashHandler();
}
return instance;
}
public void init(Context ctx){ // , UncaughtExceptionHandler
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) { // , 。。
Log.d("Sandy", "uncaughtException, thread: " + thread
+ " name: " + thread.getName() + " id: " + thread.getId() + "exception: "
+ ex);
String threadName = thread.getName();
if ("sub1".equals(threadName)){
Log.d("Sandy", "");
}else if(){
// thread name , , , 。
}
}
}
2.次に、アプリケーションクラスをカスタマイズします.
クリップボードに内容をコピー
コード:
public class OurApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
CrashHandler handler = CrashHandler.getInstance();
handler.init(getApplicationContext()); // Appliction UncaughtExceptionHandler
}
}
3.AndroidManifestを配置する.xmlファイル
カスタマイズされたアプリケーションを使用しているので、Android Manifestにいます.xmlファイルに明記
クリップボードに内容をコピー
コード:
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:name=".OurApplication"
android:debuggable="true"
>
4.テスト
Activityでスレッドを起動し、スレッドに異常を投げ出してプログラムがどうなるか見てみましょう.
クリップボードに内容をコピー
コード:
Button btn = (Button) findViewById(R.id.bt);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Log.d("Sandy", "I am a sub thread");
String s = null;
s.toString(); // NullPointException
}
}, "sub thread");
thread.start();
}
5.結果
デフォルトで例外が処理されていないプロセッサがあるため、次のログ情報が印刷され、例外が放出されてプログラムが異常終了することはありません.
D/Sandy ( 2228): I am a sub thread
D/Sandy ( 2228): uncaughtException, thread: Thread[sub thread,5,main] name: sub thread id: 148exception: java.lang.NullPointerException
皆さんはまだ何を待っていますか?自分のアプリケーションにデフォルトの未処理例外プロセッサを追加しましょう.異常未捕獲でプログラムがクラッシュすることは二度とありません..^^;