在Android应用中找不到NullPointerException

时间:2012-05-01 01:46:22

标签: android nullpointerexception

我需要帮助找到为什么我得到空指针异常。我已经尝试进入调试模式,但如果这适用于Eclipse和Android,我无法弄清楚如何使用它。 第一种方法是计算文件所具有的行数(这将随时间变化)以初始化数组。数据实际上是在方法setData()中设置的。

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());



}

}

3 个答案:

答案 0 :(得分:0)

调试肯定适用于Eclipse和Android,是一个非常有用的工具,所以我绝对建议你熟悉它。

如果你检查'logcat'窗口,你会看到一个堆栈跟踪,它将告诉你获得空指针的确切行。如果你仍然无法弄清楚那里粘贴堆栈跟踪,这里的人应该能够提供帮助。

如果在Eclipse中找不到logcat窗口,请转到窗口 - &gt;显示视图 - &gt;其他 - &gt; Android-&GT; logcat中。

答案 1 :(得分:0)

我会在这里继续下去并猜测NPE正在dropBoxes[pointer] = iButtonName;发生,这是因为这一行dropBoxes=new String[countLines()];没有被执行。不会为活动执行无参数构造函数。

dropBoxes=new String[countLines()];中致电setData()之前,请先onCreate()

答案 2 :(得分:0)

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

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

您的构造函数调用正在抛出NullPointerException。如果传递给scanner构造函数的对象未实现Readable接口,则将抛出空指针异常。因此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。如果是这种情况,那么问题可能是文件名或文件属性。它可读吗?它有权限吗?