在许多类(Activity,Fragment,Adapter,...)中,我需要访问对象。
所以我把它放到Application类中。 (app,user)
MainAppliction.java
private static MainApplication singleton;
public static MainApplication getApplication() {
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
private UserVo user; // I did not put null value
public UserVo getUser()(...)
public void setUser(UserVo user){...} // Called in LoginActivity
ActivityA.java,ActivityB.java,ActivityC.java
UserVo user;
@Override
public void onCreate(Bundle savedInstanceState) {
//...
app = ((MainApplication) getApplicationContext());
// or app = MainApplication.getApplication();
user = app.getUser(); // Always Not Null
//...
}
@Override
public void onResume() {
user.getData(); // Sometimes NullPointerExeception By GC (Maybe?)
}
如何防止空指针异常?
我认为有几点想法。但我不确定它们是否可以成为解决方案...1。将MainApplication中的UserVo用户更改为Static memeber
像这样(MainApplication.java)
private static UserVo user;
public static UserVo getUser()(...)
2。调用getUser()不使用UserVo Memeber
像这样(Activity.java)
@Override
public void onResume() {
MainApplication.getApplication().getUser().getData();
}
第3。使界面(这很复杂......我不想这样做)
喜欢这个 (MainApplication.java)
interface OnUser {
void onUser(UserVo user);
}
public void getUser(OnUser onUser) {
if (user == null)
// Start Login Activity, and receive UserVo from Server.
else
onUser.onUser(user);
}
(Activity.java)
@Override
public void onResume() {
MainApplication.getApplication().getUser(new OnUser() {
void onUser(UserVo user) {
//Do Work.
}
});
}
请给我一些提示。
答案 0 :(得分:0)
如何防止空指针异常?
易。
在构造函数中正确初始化所有对象,以便100%准备好使用它们。不允许任何空引用。
private static UserVo user;
正如所写,user
是null
。为什么?静电为什么?为什么不初始化的私有数据成员指向创建时的新UserVo
引用?
否则,在使用引用之前,必须在任何地方检查null。这是一种糟糕的风格,只会随着你的情况变得更糟。
答案 1 :(得分:0)
在处理之后访问对象之前检查空值的另一种方法。
事实上,检查空值并处理null(通过java异常处理)总是一个好主意。此外,您可以对变量/引用进行默认初始化,使得对对象的方法调用不会产生副作用。
例如在arrayList的情况下;声明List abc = new ArrayList();
之类的变量会为你创建一个空的arraylist。在一些处理逻辑之后说,如果变量没有累积任何数据,它将保持为空;但永远不会抛出nullpointer异常。
答案 2 :(得分:0)
如何防止空指针异常?
避免NullPointerException
的最安全方法是检查对象引用,以确保在访问它们之前它们不为空。
虽然这种方法可以确保您不会遇到意外的NullPointerExceptions,但它也会使代码膨胀,使其更难开发,影响它的可读性,并且可能会隐藏代码中需要最终处理的不需要的情况。
更好的方法是首先避免使用这些空值。有很多方法可以做到这一点。仅举几例:
blog post Dustin Marx很好地涵盖了这个主题。 我还建议阅读Effective Java(第2版)。
有时NullPointerExeception由GC(可能?)
如果某个对象具有来自其他活动对象的强引用,则该进程不会收集该对象,因此无法使用此方案。更有可能的是user
对象在调用onResume
方法之前未初始化。