有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从类对象的方法接收nullpointer异常

我在“主”XML文件中声明了一个自定义视图:

    <com.app.DrawView
    安卓:id="@+id/my_view"
    安卓:layout_height="match_parent"
    安卓:layout_width="match_parent" />

然后在我的活动的onCreate方法中:

setContentView(R.layout.main);

这对于显示自定义视图都很好。但我需要做的是将值传递给自定义视图。因此,我尝试创建自定义视图类的实例:

DrawView drawView = (DrawView) findViewById(R.id.my_view);

然后,在DrawView类中,我创建了一个方法:

public void setUserData(boolean data){
      useEraser = data;
}

现在,我的问题是,当我尝试在活动中访问DrawView对象的此方法时,会一直获得NullPointerExection,如下所示:

boolean value = true;
drawView.setUserData(value);

错误指向“drawView.setUserData(值)”行。我做错了什么?我知道我一定犯了一个简单的错误,但要想找到它,我简直要发疯了。任何帮助或建议都会很好

编辑:我接受了一个正确的答案,但是,我仍然想知道为什么我原来的解决方案不起作用。所以,我发现,尽管我在问题中顺序正确,我还是

DrawView drawView = (DrawView)findViewById(R.id.my_view);

以前

setContentView(R.layout.main);

我知道我忽略了一个简单的错误!谢谢大家的回答,我很感激。我希望这对任何面临类似问题的人都有用


共 (2) 个答案

  1. # 1 楼答案

    如果你想创建一个新的,试试这个

    在xml中放置一个linearlayout作为持有者

    <LinearLayout
            android:id="@+id/ln1"
            android:layout_width="wrap_content"
           android:layout_height="300dp" >
    
        </LinearLayout>
    

    在下面的oncreate中使用

    LinearLayout ln = (LinearLayout)findViewById(R.id.ln1);
             com.example.mixed.DrawView dw2 = new DrawView(getApplicationContext());
             dw2.setUserData(false);
             ln.addView(dw2);
    

    如果将它放在布局xml中,就不会有问题

    enter image description here

  2. # 2 楼答案

    您不会从方法调用中“接收”异常。方法可能会抛出一个异常,您可能会在try-catch块中捕获该异常。在这种情况下,catch块将捕获异常。否则,它将发生在方法内部。由于调用方正在引发异常,因此错误不在方法中

    在这种情况下:

    boolean value = true;
    drawView.setUserData(value);
    

    唯一可以为null的是drawView。因此,findViewById将返回null,或者,您正在其他地方将drawView设置为null。您可以通过在此处放置断点来证明这一点:

    DrawView drawView = (DrawView) findViewById(R.id.my_view);
    

    并检查drawView的值

    从你提供的信息来看,我不明白为什么会这样,但这是你必须做的检查

    顺便说一句,您应该始终在自定义视图中提供所有3个视图构造函数原型。您缺少:

     public DrawView(Context context, AttributeSet attrs, int defaultStyle){
     super(context, attrs, defaultStyle);
    

    如果覆盖默认小部件样式,则使用此构造函数