簡體   English   中英

從類對象的方法接收nullpointer異常

[英]Receiving nullpointer exception from method of class object

我有一個在“主” 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);

我知道這是我所忽略的簡單錯誤! 謝謝大家的回答,我非常感激。 我希望這對遇到類似問題的任何人都有用。

如果您想創建一個新的,請嘗試一下,

將線性布局作為持有人放入xml

<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中,則不會有任何問題。

在此處輸入圖片說明

您不會從方法調用中“接收”異常。 方法可能會引發異常,您可能會在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);

如果默認的窗口小部件樣式被覆蓋,則使用此構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM