Android与标准java的不同行为

时间:2012-02-07 21:51:35

标签: java android multithreading

在标准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第二线程访问中我的主线,怎么可能?

2 个答案:

答案 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现在可以正常工作。