Java 为什么会有NullPointerException?

Java 为什么会有NullPointerException?,java,android,android-activity,android-studio,nullpointerexception,Java,Android,Android Activity,Android Studio,Nullpointerexception,导致问题的代码位于我的应用程序的MainActivity中。在onCreate方法中,有一个线程运行一个名为uploadImage()的方法。然后返回一个映射,并在UploadeImage(映射实例)中设置。在线程之后,public映射上传图像为空。(它在声明为空的行上抛出一个NullPointerException)。有人知道为什么UploadeImage在线程外被视为null吗?谢谢 ... public Map uploadedImage; @Override protected voi

导致问题的代码位于我的应用程序的MainActivity中。在onCreate方法中,有一个线程运行一个名为uploadImage()的方法。然后返回一个映射,并在UploadeImage(映射实例)中设置。在线程之后,public映射上传图像为空。(它在声明为空的行上抛出一个
NullPointerException
)。有人知道为什么UploadeImage在线程外被视为null吗?谢谢

...
public Map uploadedImage;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //only perform if there is a network connection
    if(isNetworkAvailable()) {

        Thread thread = new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    //try to upload image
                    uploadedImage = uploadImage();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        thread.start();

        TextView txtURL = (TextView) findViewById(R.id.textView);
        String url = uploadedImage.toString(); //NULLPOINTEREXEPTION HERE
        txtURL.setText(url);
    }
}
...

然后,
uploadeImage
null
。此外,您应该同步进行该调用,因为此调用

String url = uploadedImage.toString();
明确要求
uploadedImage
被初始化,而不是
null

if(isNetworkAvailable()) {
    try {
        //try to upload image
        uploadedImage = uploadImage();
        TextView txtURL = (TextView) findViewById(R.id.textView);
        String url = (uploadedImage != null) ? 
                uploadedImage.toString() : "null";
        txtURL.setText(url);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

然后,
uploadeImage
null
。此外,您应该同步进行该调用,因为此调用

String url = uploadedImage.toString();
明确要求
uploadedImage
被初始化,而不是
null

if(isNetworkAvailable()) {
    try {
        //try to upload image
        uploadedImage = uploadImage();
        TextView txtURL = (TextView) findViewById(R.id.textView);
        String url = (uploadedImage != null) ? 
                uploadedImage.toString() : "null";
        txtURL.setText(url);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

然后,
uploadeImage
null
。此外,您应该同步进行该调用,因为此调用

String url = uploadedImage.toString();
明确要求
uploadedImage
被初始化,而不是
null

if(isNetworkAvailable()) {
    try {
        //try to upload image
        uploadedImage = uploadImage();
        TextView txtURL = (TextView) findViewById(R.id.textView);
        String url = (uploadedImage != null) ? 
                uploadedImage.toString() : "null";
        txtURL.setText(url);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

然后,
uploadeImage
null
。此外,您应该同步进行该调用,因为此调用

String url = uploadedImage.toString();
明确要求
uploadedImage
被初始化,而不是
null

if(isNetworkAvailable()) {
    try {
        //try to upload image
        uploadedImage = uploadImage();
        TextView txtURL = (TextView) findViewById(R.id.textView);
        String url = (uploadedImage != null) ? 
                uploadedImage.toString() : "null";
        txtURL.setText(url);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

方法uploadImage()的代码在哪里?检查里面发生了什么以及为什么它会返回null?

方法uploadImage()的代码在哪里?检查里面发生了什么以及为什么它会返回null?

方法uploadImage()的代码在哪里?检查里面发生了什么以及为什么它会返回null?

方法uploadImage()的代码在哪里?检查里面发生了什么以及为什么它会返回null?

我使用了一个ASyncTask,并将映射放在onPostExecute覆盖方法的字符串“url”中。
上述表示任务未完成执行的人是正确的。谢谢大家的帮助。

我使用了一个ASyncTask,并将映射放置在onPostExecute覆盖方法的字符串“url”中。
上述表示任务未完成执行的人是正确的。谢谢大家的帮助。

我使用了一个ASyncTask,并将映射放置在onPostExecute覆盖方法的字符串“url”中。
上述表示任务未完成执行的人是正确的。谢谢大家的帮助。

我使用了一个ASyncTask,并将映射放置在onPostExecute覆盖方法的字符串“url”中。

上述表示任务未完成执行的人是正确的。谢谢大家的帮助。

我不是线程化Java的专家,但我猜在您访问UploadeImage之前,该线程没有机会分配UploadeImage。因为您将其设置为新线程。使用asynctask,然后将它们放入onPostExecute()。或者将它们放在线程中,并使用runOnUiThread()调用start。按照现在的方式,当您点击
String url=uploadedImage.toString()时,您无法保证
uploadedImage
将使用正确的值。你看到了吗?我不知道您在
uploadImage()
中执行什么操作,但是你可能想设置一个回调来知道你的任务何时完成。教育我:如果你的代码在线程完成执行之前无法继续,那么在这里使用线程有什么意义呢?这可能与你的问题无关,但是使用piccaso jar上传图像。不要重新发明轮子,如果它是为了学习曲线,那么就不是线程化Java的专家,但我的猜测是,在访问UploadeImage之前,该线程没有机会分配UploadeImage,因为它是作为一个新线程创建的。使用asynctask,然后将它们放入onPostExecute()。或者将它们放在线程中,并使用runOnUiThread()调用start。按照现在的方式,当您点击
String url=uploadedImage.toString()时,您无法保证
uploadedImage
将使用正确的值。你看到了吗?我不知道您在
uploadImage()
中执行什么操作,但是你可能想设置一个回调来知道你的任务何时完成。教育我:如果你的代码在线程完成执行之前无法继续,那么在这里使用线程有什么意义呢?这可能与你的问题无关,但是使用piccaso jar上传图像。不要重新发明轮子,如果它是为了学习曲线,那么就不是线程化Java的专家,但我的猜测是,在访问UploadeImage之前,该线程没有机会分配UploadeImage,因为它是作为一个新线程创建的。使用asynctask,然后将它们放入onPostExecute()。或者将它们放在线程中,并使用runOnUiThread()调用start。按照现在的方式,当您点击
String url=uploadedImage.toString()时,您无法保证
uploadedImage
将使用正确的值。你看到了吗?我不知道您在
uploadImage()
中执行什么操作,但是你可能想设置一个回调来知道你的任务何时完成。教育我:如果你的代码在线程完成执行之前无法继续,那么在这里使用线程有什么意义呢?这可能与你的问题无关,但是使用piccaso jar上传图像。不要重新发明轮子,如果它是为了学习曲线,那么就不是线程化Java的专家,但我的猜测是,在访问UploadeImage之前,该线程没有机会分配UploadeImage,因为它是作为一个新线程创建的。使用asynctask,然后将它们放入onPostExecute()。或者将它们放在线程中,并使用runOnUiThread()调用start。按照现在的方式,当您点击
String url=uploadedImage.toString()时,您无法保证
uploadedImage
将使用正确的值。你看到了吗?我不知道您在
uploadImage()
中执行什么类型的操作,但您可能想设置一个回调来知道任务何时完成