2016-05-26 42 views
-1

我正在學習John Horton編寫的Android遊戲Learning Java以及其第一個示例Math Game,運行時出現以下錯誤。我收到一個錯誤,它試圖調用空引用上的方法,但我無法調試它

顯示java.lang.NullPointerException:嘗試在一個空 對象引用

這裏調用虛擬方法 '無效 android.widget.TextView.setText(java.lang.CharSequence中)' 是我代碼:

遊戲活動

package com.example.mike.mathgame; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.Button; 
import android.widget.TextView; 

public class GameActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Loads up UI 
     setContentView(R.layout.activity_main); 

     int partA = 2; 
     int partB = 3; 
     int correctAnswer = partA * partB; 
     int wrongAnswer1 = correctAnswer - 1; 
     int wrongAnswer2 = correctAnswer + 1; 

     TextView textObjectPartA = (TextView)findViewById(R.id.textPartA); 
     TextView textObjectPartB = (TextView)findViewById(R.id.textPartB); 
     Button buttonObjectChoice1 = (Button)findViewById(R.id.buttonChoice1); 
     Button buttonObjectChoice2 = (Button)findViewById(R.id.buttonChoice2); 
     Button buttonObjectChoice3 = (Button)findViewById(R.id.buttonChoice3); 

     textObjectPartA.setText("" + partA); 
     textObjectPartB.setText("" + partB); 

     buttonObjectChoice1.setText("" + correctAnswer); 
     buttonObjectChoice2.setText("" + wrongAnswer1); 
     buttonObjectChoice3.setText("" + wrongAnswer2); 



    } 
} 

主要活動

package com.example.mike.mathgame; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 


public class MainActivity extends Activity implements View.OnClickListener{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final Button buttonPlay = (Button)findViewById(R.id.buttonPlay); 
     buttonPlay.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view){ 
     Intent i; 
     i = new Intent(this, GameActivity.class); 
     startActivity(i); 
    } 
} 

Content_game

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
app:layout_behavior="@string/appbar_scrolling_view_behavior" 
tools:context="com.example.mike.mathgame.GameActivity" 
tools:showIn="@layout/activity_game"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="2" 
    android:id="@+id/textPartA" 
    android:layout_marginTop="83dp" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="x" 
    android:id="@+id/textOperator" 
    android:layout_alignTop="@+id/textPartA" 
    android:layout_centerHorizontal="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="2" 
    android:id="@+id/textPartB" 
    android:layout_alignTop="@+id/textOperator" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="=" 
    android:id="@+id/textView2" 
    android:layout_marginTop="64dp" 
    android:layout_below="@+id/textOperator" 
    android:layout_alignLeft="@+id/textOperator" 
    android:layout_alignStart="@+id/textOperator" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="4" 
    android:id="@+id/buttonChoice1" 
    android:layout_centerVertical="true" 
    android:layout_centerHorizontal="true" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="5" 
    android:id="@+id/buttonChoice2" 
    android:layout_below="@+id/buttonChoice1" 
    android:layout_alignLeft="@+id/buttonChoice1" 
    android:layout_alignStart="@+id/buttonChoice1" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="6" 
    android:id="@+id/buttonChoice3" 
    android:layout_below="@+id/buttonChoice2" 
    android:layout_centerHorizontal="true" /> 

activity_game

<?xml version="1.0" encoding="utf-8"?> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 

</android.support.design.widget.AppBarLayout> 

<include layout="@layout/content_game" /> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom|end" 
    android:layout_margin="@dimen/fab_margin" 
    android:src="@android:drawable/ic_dialog_email" /> 

+0

請在你的文章中包含你的佈局文件。 – hexafraction

+0

你說你不能調試它 - 爲什麼不呢?什麼東西阻止你?我不太明白。 –

回答

0

至少你的意見之一,當您使用findViewById()在GameActivity是找不到的。檢查它們中的每一個的空值。看你的代碼時彈出

一件事是,這條線在GameActivity可能是錯誤的: setContentView(R.layout.activity_main);

+0

就是這樣。謝謝! – Risen

0

雖然你已經解決了這一問題。你說你不能調試它。所以你可能幾乎沒有調試經驗。基本上,這包括在點上添加代碼並檢查代碼是否在按照您的意願進行操作。

我不確定Eclipse是什麼,但肯定Android Studio使得它非常簡單。但是,首先,你可以在沒有的情況下做到這一點。

很明顯,主要活動被稱爲第一個,當被稱爲onCreate方法將被調用。從這些信息開始,可以添加編碼可見(明智)消息。因此,我們儘快添加一些代碼爲主要活動啓動後,立即爲onCreate語句後,按: -

protected void onCreate(Bundle savedInstanceState) { 
     Log.e("MYGAME","B4 super.onCcreate reached OK."); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final Button buttonPlay = (Button)findViewById(R.id.buttonPlay); 
     buttonPlay.setOnClickListener(this); 
    } 

如果您運行的應用程序,那麼你會得到的線沿線的東西: -

05-26 16:29:04.250 1828-1828/mike092015.app001 E/MYGAME:B4 super.onCcreate到達OK。

在日誌中,如果那行代碼到達了。如果你沒有,那麼你知道該程序在該行之前失敗。這是調試的核心原則。

Android Studio使得這一點變得更容易。您可以通過單擊代碼左側的行中插入中斷點的行號。 不在行號上,而是在行號和代碼之間,但在列內。 A 紅圈會出現。

而不是使用綠色箭頭運行應用程序通過單擊小綠色缺陷(運行箭頭旁邊)(運行/調試應用程序或Shift F9)運行它。程序將在該行代碼執行之前停止,並且調試窗口將包含諸如變量當前狀態等信息。您還可以選擇控制代碼的完成方式。當然,如果沒有達到斷點,那麼它回到了重新考慮調試策略。

相關問題