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);
我知道我忽略了一个简单的错误!谢谢大家的回答,我很感激。我希望这对任何面临类似问题的人都有用
# 1 楼答案
如果你想创建一个新的,试试这个
在xml中放置一个linearlayout作为持有者
在下面的oncreate中使用
如果将它放在布局xml中,就不会有问题
# 2 楼答案
您不会从方法调用中“接收”异常。方法可能会抛出一个异常,您可能会在try-catch块中捕获该异常。在这种情况下,catch块将捕获异常。否则,它将发生在方法内部。由于调用方正在引发异常,因此错误不在方法中
在这种情况下:
唯一可以为null的是drawView。因此,findViewById将返回null,或者,您正在其他地方将drawView设置为null。您可以通过在此处放置断点来证明这一点:
并检查drawView的值
从你提供的信息来看,我不明白为什么会这样,但这是你必须做的检查
顺便说一句,您应该始终在自定义视图中提供所有3个视图构造函数原型。您缺少:
如果覆盖默认小部件样式,则使用此构造函数