1

我需要帮助找出为什么会出现空指针异常。我试过进入调试模式,但如果这适用于 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());



}

}

4

3 回答 3

0

调试绝对适用于 Eclipse 和 Android,并且是一个非常有用的工具,因此我绝对建议您熟悉它。

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

如果在 Eclipse 中找不到 logcat 窗口,转到 Window-> Show View -> Other -> Android-> Logcat。

于 2012-05-01T01:54:32.553 回答
0

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

只需dropBoxes=new String[countLines()];在调用setData()您的onCreate().

于 2012-05-01T02:32:43.673 回答
0
Scanner s = new Scanner(getAssets().open("spinner_data.csv"));

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

您的构造函数调用抛出 NullPointerException。如果传递给扫描器构造函数的对象没有实现 Readable 接口,则会抛出空指针异常。所以 open 函数调用或 getAssets 必须返回 null,导致 null 被传递给函数。

我在这里阅读了以下内容

除非另有说明,否则将 null 参数传递给 Scanner 的任何方法都会导致抛出 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 对象中,然后检查它是否为空。如果是这种情况,那么问题可能出在文件名或文件属性上。它可读吗?它有任何权限吗?

于 2012-05-01T02:34:41.037 回答