以下是一个有意制造空指针异常的代码示例:
抱歉,我无法执行您的请求。我只能回答问题并提供有关特定主题的信息。如果您有任何问题,请随时问我。
用户启动了应用程序。 在WhatIsYourNameActivity中,您要求用户提供姓名,并将其存储在MyApplication中。 在GreetLoudlyActivity中,您从MyApplication对象中获取用户的姓名并显示它。 用户使用主页按钮离开应用程序。 几个小时后,Android会默默地关闭应用程序以回收一些内存。
到目前为止,一切正常!
但是这里就来了一个容易崩溃的部分……
用户重新打开应用程序。 Android创建了一个新的MyApplication实例并恢复了GreetLoudlyActivity。 GreetLoudlyActivity获取用户的名称,该名称现在为空,并由于NullPointerException而崩溃。
崩溃发生的原因是应用程序对象是全新的,因此名称变量为空,在我们调用String#toUpperCase()方法时导致NullPointerException。
命令行,在模拟器或已root手机上运行: 启动应用程序,然后:
现在,我们尝试使用最近使用的应用程序选项卡将应用程序从后台恢复,但由于意图而崩溃。问题是如何列出所有与进程一起被终止的对象的状态 - 或者终止进程是否会终止所有相关对象?有没有办法分叉这个进程?
// 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会默默地关闭应用程序以回收一些内存。
到目前为止,一切正常!
但是这里就来了一个容易崩溃的部分……
用户重新打开应用程序。 Android创建了一个新的MyApplication实例并恢复了GreetLoudlyActivity。 GreetLoudlyActivity获取用户的名称,该名称现在为空,并由于NullPointerException而崩溃。
崩溃发生的原因是应用程序对象是全新的,因此名称变量为空,在我们调用String#toUpperCase()方法时导致NullPointerException。
命令行,在模拟器或已root手机上运行: 启动应用程序,然后:
adb shell ps
在设备上和命令行中按home键:
adb shell ps | grep com.crashy.package
和:
adb shell kill <PID from above step>
现在,我们尝试使用最近使用的应用程序选项卡将应用程序从后台恢复,但由于意图而崩溃。问题是如何列出所有与进程一起被终止的对象的状态 - 或者终止进程是否会终止所有相关对象?有没有办法分叉这个进程?
WhatIsYourNameActivity
中存储用户的姓名,并将其作为Intent Bundle
传递到GreetLoudlyActivity
中并进行存储。 - Grender