2010-08-06 149 views
2

我logcat的NullPointerException異常錯誤

08-06 01:27:34.874: ERROR/AndroidRuntime(721): Uncaught handler: thread main exiting due to uncaught exception 
08-06 01:27:34.893: ERROR/AndroidRuntime(721): java.lang.NullPointerException 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at one.two.Booking$MyOnItemSelectedListener.onItemSelected(Booking.java:53) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at android.widget.AdapterView.fireOnSelected(AdapterView.java:856) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at android.widget.AdapterView.access$200(AdapterView.java:41) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:827) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at android.os.Handler.handleCallback(Handler.java:587) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at android.os.Looper.loop(Looper.java:123) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at android.app.ActivityThread.main(ActivityThread.java:3948) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) 
08-06 01:27:34.893: ERROR/AndroidRuntime(721):  at dalvik.system.NativeStart.main(Native Method) 

Booking.java

package one.two; 

import android.app.Activity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.AdapterView.OnItemSelectedListener; 


public class Booking extends Activity 
{ 
    private DBAdapter db; 
    private Spinner colourSpinner; 
    public Cursor c; 
    public TextView txtArrival; 
    /** Called when the activity is first created. */ 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     db = new DBAdapter(this); 
     this.setContentView(R.layout.booking); 
     db.open(); 
     fillData(); 
     db.close(); 
     TextView txtArrival = (TextView) findViewById(R.id.txtArrival); 
     Spinner colourSpinner = (Spinner) findViewById(R.id.myspinner); 
     colourSpinner.setOnItemSelectedListener(new MyOnItemSelectedListener()); 
    } 

    private void fillData() 
    { 
     c = db.getSpinnerData(); 
     startManagingCursor(c); 
     String[] from = new String[]{DBAdapter.KEY_ARRIVAL}; 
     int[] to = new int[]{android.R.id.text1}; 
     SimpleCursorAdapter adapter = 
     new SimpleCursorAdapter(this,R.layout.booking, c, from, to); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     Spinner colourSpinner = (Spinner) findViewById(R.id.myspinner); 
     colourSpinner.setAdapter(adapter); 
    } 
    public class MyOnItemSelectedListener implements OnItemSelectedListener 
    { 
     public void onItemSelected(AdapterView<?> arg0, View v,int position, long id) 
     { 
      boolean result = Booking.this.c.moveToPosition(position); 
      if (result) { 
       String title=Booking.this.c.getString(1); 
       Booking.this.txtArrival.setText(title); 
      } 

     } 
     @Override 
     public void onNothingSelected(AdapterView<?> arg0) 
     { 
      // TODO Auto-generated method stub 

     } 
    }; 
} 

我想知道如何解決這個錯誤。 謝謝。

+0

添加代碼 – User358218 2010-08-06 03:24:25

回答

2

您正在創建與您的班級成員具有相同名稱的局部變量。這導致成員被本地隱藏,這就是爲什麼你得到NullPointerExceptions。你根本不給會員任何價值,這就是爲什麼他們是空的。

你想要做的是:

package one.two; 

import android.app.Activity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.AdapterView.OnItemSelectedListener; 


public class Booking extends Activity 
{ 
    private DBAdapter db; 
    private Spinner colourSpinner; 
    public Cursor c; 
    public TextView txtArrival; 

    /** Called when the activity is first created. */ 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     db = new DBAdapter(this); 
     this.setContentView(R.layout.booking); 
     txtArrival = (TextView) findViewById(R.id.txtArrival); // Member assignment 
     colourSpinner = (Spinner) findViewById(R.id.myspinner); // Member assignment 
     db.open(); 
     fillData(); 
     db.close(); 
     colourSpinner.setOnItemSelectedListener(new MyOnItemSelectedListener()); 
    } 

    private void fillData() 
    { 
     c = db.getSpinnerData(); 
     startManagingCursor(c); 
     String[] from = new String[]{DBAdapter.KEY_ARRIVAL}; 
     int[] to = new int[]{android.R.id.text1}; 
     SimpleCursorAdapter adapter = 
     new SimpleCursorAdapter(this,R.layout.booking, c, from, to); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     // Removed this line, since members is set in onCreate 
     colourSpinner.setAdapter(adapter); 
    } 
    public class MyOnItemSelectedListener implements OnItemSelectedListener 
    { 
     public void onItemSelected(AdapterView<?> arg0, View v,int position, long id) 
     { 
      boolean result = Booking.this.c.moveToPosition(position); 
      if (result) { 
       String title=Booking.this.c.getString(1); 
       Booking.this.txtArrival.setText(title); 
      } 

     } 
     @Override 
     public void onNothingSelected(AdapterView<?> arg0) 
     { 
      // TODO Auto-generated method stub 

     } 
    }; 
} 
+0

仍然存在空錯誤,在我的logcat – User358218 2010-08-10 03:14:42

+0

錯誤在Booking.this.txtArrival.setText(title); – User358218 2010-08-10 03:22:47

+0

您是否在我的onCreate版本中使用過代碼?我已經移動了onCreate的第7行和第8行,並刪除了局部變量的創建。確保你理解你爲什麼從一開始就有空指針,你將能夠更快地解決這些問題! – Key 2010-08-10 07:19:04

0

它看起來像錯誤是53行,而不是54

在任何情況下,你提領一空指針。只需檢查並查看哪個變量未定義,並避免調用它(或確保它已正確初始化)。

假設你列出了正確的一行,它可以是txtArrivalBooking.this(我不確定你是否可以在課堂上致電this)。

+0

對不起,你是什麼意思提領一空指針和如何將我去這樣做呢? – User358218 2010-08-06 03:20:12

+1

您可以從Booking的內部類中調用Booking.this來引用預訂對象而不是內部類。 – 2010-08-06 03:21:21

+0

因此,而不是Booking.this,我會改變它? – User358218 2010-08-06 03:23:48

0

我相信你需要確保變量「C」不爲空。

String title = c.getString(1); txtArrival.setText(title);

似乎是麻煩的代碼,如果c爲null,那麼c.getString(1)應該返回nullpointerexception,或者它可能只是不返回任何內容,導致title爲null,並將txtarrival.setText設置爲null拋出一個錯誤。

+0

那麼我會去解決它?因爲我已經有了c = db.getSpinnerData(),它在遊標中有數據。 – User358218 2010-08-06 04:11:37

+0

添加一個if檢查c是否爲空或標題。 – Nicholas 2010-08-06 05:08:54

0

在線53上只有一個地方可以獲得NPR:txtArrival.setText()

我相信你忘了在佈局中將TextView的ID設置爲R.id.txtArrival,並且(TextView) findViewById(R.id.txtArrival);返回NULL。

+0

我已經做了TextView txtArrival =(TextView)findViewById(R.id.txtArrival);在我的創建方法。 – User358218 2010-08-06 05:29:09