由findViewById引起的NullPointerException

时间:2014-11-09 23:11:46

标签: java android

我无法找到此行抛出NullPointerException异常的原因:

ImageView imageView1 =  (ImageView) rootView.findViewById(R.id.imageView1);

这一切都发生在一个片段中 这是片段:

public static class MyFragment extends Fragment {

    private View rootView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.fragment_layout,
                container, false);

        return rootView;
    }

    public void setImage(Uri imageUri) {
        ImageView imageView1 =  (ImageView) rootView.findViewById(R.id.imageView1);
        imageView1.setImageURI(imageUri);
    }
}

这是片段布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ScrollView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</ScrollView>
</RelativeLayout>

方法setImage()从片段外部调用。

2 个答案:

答案 0 :(得分:1)

因此,您的rootView似乎是null;

您确定要在已调用setImage()的片段实例上调用onCreateView吗?您可以通过向两个方法添加println并检查控制台/ LogCat的顺序来测试这一点。

您可以将代码发布到setImage()

如果确实存在,那就是问题,有几个解决方案,有些比其他解决方案更好。对于初学者,您可以尝试将rootViewimageView1传递到您致电setImage()的活动,并将setImage()移至该活动。不是最佳做法,但试试看它是否有效。

(会有评论,但我没有足够的声誉。回复评论,我会根据你的评论编辑答案。)

答案 1 :(得分:0)

这是因为这条线而发生的 private View rootView;声明rootView但未将其设置为等于任何内容,因此默认情况下它的值为NULL或rootView == NULL为真。虽然您在onCreateView()中进行了设置,但如果永远不会调用onCreateView()会发生什么? rootView仍然为NULL,即使setImage()依赖于它被设置为某种东西,这将导致NULLPounterException。没有要求在onCreateView()之前调用setImage()或者甚至调用,这意味着rootView可能仍然为null,因此没有调用.findViewById()方法。虽然技术上确实首先调用onCreateView(),但Java编译器并不知道这一点。这与Android本身的工作方式有关,而与实际的Java语言无关。实际上onCreateView()确实在您有机会运行setImage()之前运行,但是编译器仍然会抱怨。如果您只使用if语句包装函数以确保rootView在执行任何操作之前永远不为NULL,则应该修复此问题。

改变这个:

public void setImage(Uri imageUri) {
        ImageView imageView1 =  (ImageView) rootView.findViewById(R.id.imageView1);
        imageView1.setImageURI(imageUri);
    }
}

对此:

public void setImage(Uri imageUri) {
        //Will only run if rootView isn't NULL so you won't be able to get a NULLPointer
        if(rootView != NULL){
        ImageView imageView1 =  (ImageView) rootView.findViewById(R.id.imageView1);
        imageView1.setImageURI(imageUri);
        }
    }
}