私は意図的にnullポインタ例外を導入するアプリを持っています。コード例を次のように私はこれを説明します:プロセスの状態が終了したかどうかを確認する方法、あるいはこれが可能なのか?
// access modifiers omitted for brevity
class MyApplication extends Application {
String name;
String getName() {
return name;
}
void setName(String name) {
this.name = name;
}
}
// ============================== ======
// access modifiers omitted for brevity
class WhatIsYourNameActivity extends Activity {
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.writing);
// Just assume that in the real app we would really ask it!
MyApplication app = (MyApplication) getApplication();
app.setName("Developer Phil");
startActivity(new Intent(this, GreetLoudlyActivity.class));
}
}
// =================================== ===================
// access modifiers omitted for brevity
class GreetLoudlyActivity extends Activity {
TextView textview;
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.reading);
textview = (TextView) findViewById(R.id.message);
}
void onResume() {
super.onResume();
MyApplication app = (MyApplication) getApplication();
textview.setText("HELLO " + app.getName().toUpperCase());
}
}
ユーザーがアプリを起動します。 WhatIsYourNameActivityでは、ユーザーの名前を尋ねて、それをMyApplicationに格納します。 GreetLoudlyActivityでは、MyApplicationオブジェクトからユーザーの名前を取得して表示します。 ユーザーはホームボタンを使用してアプリを離れる。 数時間後、Androidは暗黙的にアプリを殺してメモリを再利用します。
これまでのところ、とても良いです!
しかし、ここでcrashy一部を付属しています...
ユーザーはアプリを再オープンします。 Androidは新しいMyApplicationインスタンスを作成し、GreetLoudlyActivityを復元します。 GreetLoudlyActivityはユーザー名を取得します。ユーザー名はnullになり、NullPointerExceptionでクラッシュします。
Applicationオブジェクトが新品なのでクラッシュします。そのため、name変数はnullで、String#toUpperCase()を呼び出すとNullPointerExceptionが発生します。あなたがエミュレータや根ざし電話上でこれを実行する
コマンドライン、:、アプリを起動し、その後 :デバイス上で、コマンドライン上のホーム
adb shell ps
プレス:
adb shell ps | grep com.crashy.package
と:
adb shell kill <PID from above step>
ここで、私たちはrecents apps tを使用してバックグラウンドからアプリを戻そうとしますabsとそれは意図したようにクラッシュします。問題は、プロセスと一緒に殺されたすべてのオブジェクトの状態を一覧表示する方法、またはプロセスを強制終了して関連するすべてのオブジェクトを終了させる方法です。このプロセスをフォークする方法はありますか?
「WhatIsYourNameActivity」にユーザの名前を格納し、それを 'GreetLoudlyActivity'に' Intent Bundle'として渡してそこに格納することができます。 – Grender
それは私の質問ではありません。私は意図的にこの問題を紹介しています。プロセスが強制終了されたときに何が起こるのかを分析したいと思います。強く参照されているオブジェクトはどうなりますか? – Skynet
これは答えではありませんが、なぜアプリケーションクラスに名前を格納するのですか?なぜ共有プレフィックスにはありませんか? – varunkr