Android与标准java上的不同行为

Android与标准java上的不同行为,java,android,multithreading,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.s

在标准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(字符串appPackageName)
调用first。
Log.d(TAG+1,modelData.getAppName())
不会抛出NullPointerException,但
Log.d(TAG+2,modelData.getAppName())
抛出我认为这是正确的行为,因为我不将实例共享给线程。它只能从主线程访问。但在标准java中,第二个线程访问我的主线程,这怎么可能呢

您是否实例化过数据对象

在我看来,您的问题只是modelData可能为null,您试图对其调用
.getAppName()
,如果modelData为null,则会抛出null指针


如果您也不实例化数据对象,我不希望它在“普通”java上正常工作,但肯定有可能存在一些差异,导致它在其中一个上工作,而不是在另一个上工作。

您能将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();
}

如果
//工作正常
仍然工作,那么
//不工作
现在将工作。

它在哪里引发异常?什么是null?Log.d(标记,modelData.getAppName());看起来modelData未初始化。在哪里初始化modelData?这是不可能的。modelData必须为null。可能您有两个实例,并且只有一个被初始化?如果没有看到更多相关的代码,我们不能说。但是modelData是空的,这是可以肯定的。请编辑您的原始问题,不要在注释中发布代码,这是不可读的。此外,这还不能告诉我们modelData是在哪里声明的。我确信modelData不是空的,我可以在同一个方法中毫无例外地从线程外部访问它。我对此没有问题。我对标准java行为感到困惑。即使我不共享实例,不同的线程如何访问主线程是可变的?是的,它是有效的。谢谢。但我仍然对不同的线程如何访问主线程感到困惑标准java中的变量?根据您的问题,没有足够的上下文。您是否将引用设置为null?例如,如果您设置了
writeApp();modelData=null你可能会得到一个NPEYes,我知道。我知道final关键字的意思。通过防止数据为null并使其保持常量,修复了抛出NullPointerException的问题。标准java行为正确吗?我理解线程错误了吗?因为我知道如果我不将实例共享给线程,我就无法访问它。如果您曾经将modelData设置为null,那么是的,您肯定会得到NullPointerException。在匿名线程类中访问它时,您正在访问全局共享字段。如果在创建myThread后字段发生了更改,则run方法将看到新创建的对象(如果为null)