为什么不将此代码放入函数会导致空指针异常?

时间:2017-02-21 20:18:06

标签: java android nullpointerexception

我正在谷歌的Udacity上学习Android课程,以学习Android和Java。目前,我正在开发的项目是构建一个代表咖啡订购的应用程序。有一个数量的TextView,以及一个+和 - 按钮,在点击时可以增加或减少数量,还有一个提交订单按钮,它会调用打印订单摘要的方法。

不幸的是,我丢失了该应用的原始源代码,所以我尝试自己重建它。我得到了它的工作,但不是我最初设计它的方式。我遇到的问题是,如果我引用TextView来存储在自己的方法之外订购的咖啡数量,那么应用程序会因NullPointerException而立即崩溃。但是,如果我通过创建一个名为display(int number)的方法引用TextView,那么应用程序运行正常。导致此NullPointerException的原因是什么?我在下面提供了两个源代码的链接,其中一个工作正常,另一个工作正常崩溃。

的NullPointerException: https://gist.github.com/CalebF98/eeb7d4144b831b247264ad6a3de0cb76 在此代码中崩溃应用程序的部分位于MainActivity.java文件中的第18行

工作正常: https://gist.github.com/CalebF98/906967d4ebe8ae4d1293a0a13b01f477 在这一行中,在第37-39行,我创建了一个方法,该方法保存相同的代码以引用TextView,如上例所示,稍后由+和 - 按钮的方法调用。

谢谢!

2 个答案:

答案 0 :(得分:1)

findViewById要求ActivityonCreate(Bundle)

中夸大XML

在第一个代码示例中,您正在使用ID"数量"初始化TextView。在onCreate方法之外,因此在创建Activity对象时会初始化它。此时,没有根View,因此findViewById方法正在尝试在视图层次结构中搜索所需的TextView,但根视图为null

在第二个代码示例中,findViewById仅在onClick方法中调用,因此在视图层次结构膨胀之后才能调用它,因此一切正常。

答案 1 :(得分:0)

 <TextView
    android:text="Order Summary"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="16dp"
    android:textAllCaps="true"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="16dp"
    android:id="@+id/order_summary"
    android:text="$0"/>

您忘记将id放在第一个文本视图中。希望将id添加到第一个文本视图可以解决问题