2012-05-01 15 views
1

我需要幫助找到爲什麼我得到空指針異常。我試圖進入調試模式,但如果這與Eclipse和Android一起工作,我無法弄清楚如何使用它。 第一種方法是計算文件的行數(這將隨時間而改變)以初始化數組。數據實際上是在setData()方法中設置的。在Android應用程序中找不到NullPointerException

public class ATS_BoxesActivity extends Activity { 

private String iButtonID, iButtonName; 
private String routeID, stopNum; 
private String lat, lon; 
private String[] dropBoxes; 


public ATS_BoxesActivity() throws IOException{ 
    dropBoxes=new String[countLines()]; 

} 
private int countLines() throws IOException{ 
BufferedReader(getResources().openRawResource(R.raw.spinner_data)); 
    int count=0; 
    Scanner s = new Scanner(getAssets().open("spinner_data.csv")); 
    while (s.hasNextLine()) { //this is where the error is pointing  
     count++; 
     s.nextLine(); 
    } 

} 

public String[] setData() throws IOException { 

    Scanner s = new Scanner(getAssets().open("spinner_data.csv")); 
    String line = ""; 
    int pointer = 0; 
    while (s.hasNextLine()) { 
     line=s.nextLine(); 
     StringTokenizer st = new StringTokenizer(line); 
     iButtonID = (st.nextToken(",")); 
     iButtonName = (st.nextToken(",")); 
     routeID = (st.nextToken(",")); 
     stopNum = (st.nextToken()); 
     lat = (st.nextToken(",")); 
     // setLongitude(st.nextToken(",")); 
     System.out.println("DropBox: " + iButtonName); 

     dropBoxes[pointer] = iButtonName; 
     pointer += 1;   
    } 
    return dropBoxes; 
} 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 



    Spinner dropSpinner = (Spinner) findViewById(R.id.dbSpinner); 
    ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(
      this, android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    try { 
     String[] db = setData(); 
     for (int i = 0; i < db.length; i++) { 
      adapter.add(db[i]); 
     } 
     dropSpinner.setAdapter(adapter); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    Spinner fillSpinner = (Spinner) findViewById(R.id.fillSpinner); 
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
      this, R.array.fill_array, android.R.layout.simple_spinner_item); 
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    fillSpinner.setAdapter(adapter1); 
    fillSpinner.setOnItemSelectedListener(new MyOnItemSelectedListener()); 



} 

}

+0

** BufferedReader(getResources()。openRawResource(R.raw.spinner_data));在我的代碼中被註釋掉** –

回答

0
Scanner s = new Scanner(getAssets().open("spinner_data.csv")); 

getAssets().open("spinner_data.csv") //returning null 

您的構造函數調用拋出了NullPointerException。如果傳遞給掃描器構造函數的對象沒有實現可讀接口,則會拋出空指針異常。所以open函數調用或getAssets必須返回null,導致null傳遞給函數。

我閱讀以下,here

除非另有說明,一個null參數傳遞到掃描儀的任何方法 將導致拋出NullPointerException。

和下面的代碼會產生一個NullPointerException

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Scanner s; 
    InputStream is = null; 
    s = new Scanner(is); 
} 


Exception in thread "main" java.lang.NullPointerException 
    at java.io.Reader.<init>(Unknown Source) 
    at java.io.InputStreamReader.<init>(Unknown Source) 
    at java.util.Scanner.<init>(Unknown Source) 
    at testing.main(testing.java:14) 

保存spinner_data.csv輸入流中InputStream對象,然後檢查,看它是否爲null。如果是這種情況,那麼問題可能與文件名或文件屬性有關。它是否可讀?它有沒有任何權限?

0

調試肯定工程爲Eclipse和Android是一個非常有用的工具,所以我肯定會推薦熟悉它。

如果您檢查'logcat'窗口,您應該看到一個堆棧跟蹤,它會告訴您準確獲取空指針的行。如果你仍然無法從那裏找到它,請粘貼堆棧跟蹤,這裏的某個人應該可以提供幫助。

如果找不到logcat窗口在Eclipse中,轉到窗口 - >顯示視圖 - >其他 - > Android-> Logcat。

0

我要在這裏繼續前進,猜測NPE發生在dropBoxes[pointer] = iButtonName;,這是因爲這條線dropBoxes=new String[countLines()];沒有得到執行。活動不會執行無參數構造函數。

只需在您的onCreate()中致電setData()之前dropBoxes=new String[countLines()];

相關問題