在标准java中,这段代码运行正常。但我认为不应该。
class Data{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
class Test{
private Data mData;
public void back(){
mData=new Data();
mData.setName("You");
}
public void go(){
Thread mThread = new Thread(){
public void run(){
System.out.println(mData.getName());
}
};
mThread.start();
}
}
但是当在Android中执行类似的操作时,它会抛出NullPointerException。
private void writeApp(){
Thread mThread = new Thread(){
public void run(){
Log.d(TAG,modelData.getAppName());
}
};
mThread.start();
}
//编辑
public void appOpens(String appPackageName) throws NameNotFoundException{
modelData = new ModelData();
modelData.setOpen(true);
modelData.setAppPackageName(appPackageName);
modelData.setOpenTime(getTimeMil());
setAppNameAndAppVersion();
}
private void writeApp(){
Log.d(TAG+1,modelData.getAppName());//works fine
Thread mThread = new Thread(){
public void run(){
Log.d(TAG+2,modelData.getAppName());//doenst works throws NullPointerException
}
};
mThread.start();
}
appOpens(String appPackageName)
呼唤拳头。
Log.d(TAG+1,modelData.getAppName())
不会抛出NullPointerException,但Log.d(TAG+2,modelData.getAppName())
抛出我相信它是正确的行为,因为我不共享实例到thread.It只能从主线程到达。但是在标准的java第二线程访问中我的主线,怎么可能?
答案 0 :(得分:1)
您是否曾在实例化Data对象?
对我而言,看起来你的问题只是modelData可能为null,并且你试图在它上面调用.getAppName()
,如果modelData为null,它会抛出一个空指针。
如果你没有实例化你的Data对象,我不希望它在“普通”java上正常工作,但是肯定有可能会有一些差异导致它在一个上工作,而不是另一个。
答案 1 :(得分:1)
您可以将modelData分配给最终的本地字段吗?
private void writeApp(){
final ModelData data = modelData;
Log.d(TAG+1,data.getAppName());//works fine
Thread mThread = new Thread(){
public void run(){
Log.d(TAG+2,data.getAppName());//doenst works throws NullPointerException
}
};
mThread.start();
}
如果//works fine
仍然有效,那么//doesnt work
现在可以正常工作。