2010-08-10 98 views
0

有一個空錯誤,我一直試圖解決它2天。我的代碼有什麼問題?

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 myCursor; 
    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() 
    { 
     myCursor = db.getSpinnerData(); 
     startManagingCursor(myCursor); 
     String[] from = new String[]{DBAdapter.KEY_ARRIVAL}; 
     int[] to = new int[]{android.R.id.text1}; 
     SimpleCursorAdapter adapter = 
     new SimpleCursorAdapter(this,R.layout.booking, myCursor, 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.myCursor.moveToPosition(position); 
      if (result) { 
       String title=Booking.this.myCursor.getString(1); 
       Booking.this.txtArrival.setText(title); 
      } 

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

     } 
    }; 
} 

logcat的

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

謝謝。

+0

'txtArrival'爲空? – msandiford 2010-08-10 04:31:15

+0

是的,我應該把數據庫中的數據放入textview。 – User358218 2010-08-10 05:59:41

+0

Booking.this?看起來很奇怪的語法;我錯過了什麼嗎? – Armand 2010-08-10 09:21:45

回答

2

第54行(如果SO保存所有格式正確)是Booking.this.txtArrival.setText(title);這意味着txtArrival可能爲空。它應該已經在你的onCreate中初始化了,但它顯然沒有。如果您查看View#findViewById的文檔,您將看到它返回「如果找到,則返回」否則返回null。「

我敢打賭,您的booking.xml佈局文件中不存在編號爲txtArrival的視圖。

+0

User358218 2010-08-10 09:19:34

+3

嗯,我明白了。您的XML存在錯誤。它應該是android:id而不是android:text。 – benvd 2010-08-10 09:42:01

+0

謝謝。它有幫助。 – User358218 2010-08-11 01:43:47

1

那麼看你的代碼,通過

boolean result = Booking.this.myCursor.moveToPosition(position); 

String title=Booking.this.myCursor.getString(1) 

可以設置爲空值。最簡單的方法是用調試器遍歷代碼,至少可以看到導致NP的確切語句。

0

看起來好像myCursor爲空。您需要查看DBAdapter以瞭解在什麼情況下DBAdapter.getSpinnerData()可能返回null。

0

看來,那myCursor是NULL

你應該定義一個構造函數其中你初始化字段,你以後使用。

+0

對不起,定義構造函數是什麼意思? 已經聲明public TextView txtArrival;在我的Booking.java的頂部 – User358218 2010-08-10 09:20:18