我需要帮助找到为什么我得到空指针异常。我已经尝试进入调试模式,但如果这适用于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());
}
}
答案 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。如果是这种情况,那么问题可能是文件名或文件属性。它可读吗?它有权限吗?