2017-09-24 59 views
-2

我是Android開發新手。我的應用程序編譯完美(沒有錯誤,沒有警告),但它在啓動時崩潰。我已經診斷出崩潰的原因是NullPointerException,並且我發現如果根據此聲明刪除TextView output = (TextView) findViewById(R.id.outputbox);以及所有行,該應用程序將啓動罰款。我做了研究(無論是在Stack Exchange上還是在Stack Exchange上,還有大約5頁的Google結果),而且我找到的解決方案都沒有工作,這就是我問這個問題的原因。在TextView output = (TextView) findViewById(R.id.outputbox);之前我已經運行setContentView(R.layout.activity_main);,並且在activity_main.xml中聲明瞭outputbox。這不是現有問題的重複,因爲其他答案的答案並未解決我的問題。findViewById導致NullPointerException無明顯原因

+0

發佈您的.xml和活動代碼。 –

+0

發佈.xml代碼 –

+0

您幾乎不會爲任何特定場景找到現成的解決方案。關鍵是*理解*問題和*適應*解決方案。 – shmosel

回答

0

很可能您的聲明和變量output的初始化屬於該類。這是行不通的。方法findViewById只有在調用setContentView方法後才能使用。這就是爲什麼你必須聲明你的類變量,但setContentView方法後,立即在該方法onCreate初始化:

public class MainActivity extends AppCompatActivity { 

    TextView output; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     output = (TextView) findViewById(R.id.outputbox) 
    } 

} 

的方法findViewById搜索在XML您的組件。爲了這個工作,你必須指出這個Activity將使用什麼XML文件。這在setContentView(R.layout.activity_main);命令中完成。這是一個常見的錯誤,所以不用擔心:)

+0

我的聲明和初始化都在同一行中的類中,但在方法之後。爲什麼不這樣做? – person

+0

在任何方法被調用之前,類中變量的聲明和初始化都會發生。所以初始化將是你的類中第一個運行的代碼。閱讀活動生命週期 - 當活動在屏幕上可視化時,調用onCreate方法,然後findViewById方法可以工作。切勿在類中使用findViewById,只能在名爲AFTER onCreate的方法中使用:) –

+0

我將盡快閱讀關於Activity的生命週期。感謝您的幫助。 – person

相關問題