2012-02-17 39 views
0

我有時會用我的代碼獲取空指針異常。奇怪的是,這並不是每次都發生,我不知道爲什麼。幫幫我?setOnClickListener()發生空指針異常

package net.obviam.droidz; 
public class HomeView extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 



    setContentView(R.layout.menu); 



    Button page1 = (Button) findViewById(R.id.Button01); 
     page1.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 
//     Intent i = getIntent(); 
        Intent myIntent = new Intent(view.getContext(), DroidzActivity.class); 
        startActivityForResult(myIntent, 0); 
       } 

    }); 


} 



protected void onDestroy() { 
//  Log.d(TAG, "Destroying.."); 
     super.onDestroy(); 
    } 
    @Override 
    protected void onStop() { 
//  Log.d(TAG, "Stopping..."); 
     super.onStop(); 
    } 

} 

logcat說問題出在第19行,setOnClickListener。雖然我不確定它有什麼問題。它似乎沒有引用任何東西。

的logcat的內容是這樣的:

02-17 16:52:13.816: E/AndroidRuntime(23756): FATAL EXCEPTION: main 
02-17 16:52:13.816: E/AndroidRuntime(23756): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.obviam.droidz/net.obviam.droidz.HomeView}: java.lang.NullPointerException 
02-17 16:52:13.816: E/AndroidRuntime(23756): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at android.os.Looper.loop(Looper.java:130) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at android.app.ActivityThread.main(ActivityThread.java:3687) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at java.lang.reflect.Method.invokeNative(Native Method) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at java.lang.reflect.Method.invoke(Method.java:507) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at dalvik.system.NativeStart.main(Native Method) 
02-17 16:52:13.816: E/AndroidRuntime(23756): Caused by: java.lang.NullPointerException 
02-17 16:52:13.816: E/AndroidRuntime(23756): at net.obviam.droidz.HomeView.onCreate(HomeView.java:19) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
02-17 16:52:13.816: E/AndroidRuntime(23756): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
02-17 16:52:13.816: E/AndroidRuntime(23756): ... 11 more 

這裏是清單文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="net.obviam.droidz" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="10" /> 

<application 
    android:icon="@drawable/images" 
    android:label="@string/app_name" android:debuggable="true"> 
    <activity android:name=".HomeView" android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".DroidzActivity"></activity> 

</application> 

這裏是該按鈕被找到的XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

<Button android:text="Start Game!" 
     android:id="@+id/Button01" 
     android:layout_width="250dp" 
     android:textSize="18dp" 
     android:layout_height="55dp"> 
    </Button> 



</LinearLayout> 
+1

這意味着'page1'爲空,所以'findViewById'可能無法返回有效的對象。 – Tudor 2012-02-17 22:58:41

+0

此外,只有在點擊後退鍵或試圖在點擊後退鍵後重新啓動時纔會發生此問題。不知道這是否意義重大。 – jmarple 2012-02-17 23:05:17

回答

2

Af之三,通過提供的,我認爲這個問題是當你開始新的意圖,你要通過活動的情況下,不是視圖的堆棧跟蹤閱讀:

Button page1 = (Button) findViewById(R.id.Button01); 
page1.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
     Intent myIntent = new Intent(getContext(), DroidzActivity.class); // fix View.getContext() to getContext() 
     startActivity(myIntent); // change to startActivity 
    } 
}); 

,爲什麼這是一個陣性的問題,我沒有理念。

+0

工作正常!但是,現在點擊後退按鈕後,活動變爲灰色。這是相關的,還是我需要完全實現其他東西? – jmarple 2012-02-17 23:16:47

+0

@kpeort很高興幫助。如果你可以接受答案,如果它解決了你的問題。爲什麼你的活動變成灰色,我不知道。除非你在onCreate和onResume以及onPause中重寫了一些動畫,否則我沒有聽說過這個。 – 2012-02-17 23:21:55

+1

@kpeort:您正在使用'startActivityForResult(...)',但您的HomeView Activity的代碼沒有顯示'onActivityResult(...)'代碼塊。如果你沒有實現這種方法,那麼你不能指望任何明智的行爲。另外,如果你的'DroidzActivity'在你點擊返回按鈕(例如,在它的'onPause()'方法)時沒有返回結果,你再也不能指望明智的行爲了。修正這兩個方面,看看會發生什麼。 – Squonk 2012-02-17 23:32:55