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

时间:2012-11-28 21:48:45

标签: java android class nullpointerexception android-custom-view

我有一个自定义视图,我在'main'XML文件中声明:

    <com.app.DrawView
    android:id="@+id/my_view"
    android:layout_height="match_parent"
    android: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对象访问此方法时不断获取NullPointerExeption,如下所示:

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

错误指向“drawView.setUserData(value)”行。我究竟做错了什么?我知道我一定犯了一个简单的错误,但它让我疯狂地试图找到它。任何帮助或建议都会很棒!

编辑:我接受了一个正常运行的答案,但是,我仍然想知道为什么我的原始解决方案不起作用。所以,我发现,尽管我在问题中正确地订购了它,但我放置了

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

setContentView(R.layout.main);

我知道这是一个我忽略的错误!感谢大家的答案,我很感激。我希望这证明对遇到类似问题的人有用。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-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);

如果重写默认窗口小部件样式,则使用此构造函数。