这个NullPointerException的来源是什么

时间:2014-03-07 02:46:27

标签: java android nullpointerexception

好的,所以我正在编写一个Android应用程序,我正在尝试下载一个Bitmap并将其设置为ImageView。相关部分的代码如下:

    private class GetContactInfo extends AsyncTask<String, Void, ContactInfo[]> {

    @Override
    protected ContactInfo[] doInBackground(String... url) {
        // Instantiate what is needed
        URL json = null;

        //Set the JSON URL
        try {
            json = new URL(url[0]);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }

        // Use Jackson library to read out the data from the contacts page
        try {
            contacts = mapper.readValue(json, ContactInfo[].class);
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //Add everything into the bitmap ArrayList
        for (int i = 0; i < contacts.length; i++) {
            String imageURL = contacts[i].getSmallImageURL();

            // Download the Bitmap and add it to the ArrayList
            try {
                bitmap.add(downloadBitmap(imageURL));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // Return statement
        return contacts;
    }

public Bitmap downloadBitmap(String imageURL) throws IOException {

    URL url = new URL(imageURL);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setDoInput(true);
    connection.connect();
    InputStream stream = connection.getInputStream();
    Bitmap bitmap = BitmapFactory.decodeStream(stream);
    if (bitmap == null) {
        Log.e("Null", "Bitmap null");
    }

    return bitmap;
}

日志永远不会捕获到位图为空,或者至少它没有显示它(我在堆栈跟踪中看到还有4个错误,但它们从未出现过,我不知道如何扩展它显示其他错误。)

NullPointerException出现在bitmap.add(downloadBitmap(imageURL));行。所以我的downloadBitmap函数以某种方式返回null结果。有什么想法吗?

编辑:我不确定这是否重要,但网址中的图片是.jpeg文件。

编辑2:把它放在评论中,所以我也将它编辑到我的帖子中,位图被声明为全局变量,如此ArrayList<Bitmap> bitmap;这样我以后可以在我的onPostExecute方法中使用它。 / p>

3 个答案:

答案 0 :(得分:1)

正如你所说,错误在行

bitmap.add(downloadBitmap(imageURL)); 

这意味着罪魁祸首是位图变量,而不是downloadBitmap(imageURL)方法。

此外,在您的编辑中,您已经提到已将位图声明为全局变量 - ArrayList位图;

为了访问(向它添加位图注释)这个全局声明的变量,你必须初始化它。

在你的onCreate do -

bitmap = new ArrayList<Bitmap>(); 

和NPE必须去。

答案 1 :(得分:0)

从Internet下载图像时,应使用异步请求。在downloadBitmap中,连接正在另一个线程中下载,但主线程立即返回bitmap,无论下载是否完成。

答案 2 :(得分:0)

您在哪里初始化bitmap?据我所知,它是null并且您正在使用该null对象,因此出现Null Pointer Exception。这来自您提供的信息。如果在函数内部发生错误,那就不一样了。