我正在尝试为我的程序实现一个登录功能,但它返回一个空指针异常。我知道当你在内存中提到一个里面没有任何内容的地方时会发生这种情况,但据我所知,我已经正确地实例化了所有对象 - 如果我错了请纠正我!
我正在尝试实现添加用户功能:我有一个用户名和密码列表,我有一个现有的方法,它读取该文件并将其存储在一个数组中。我想写一个新的登录列表,所以我写了一个新的方法,将这个数组转换为ArrayList,并最终写入一个新的登录,然后再次写入登录文件。问题是我得到了空指针异常。
方法1:
public String[] readFile(){
ArrayList<String> dataList = new ArrayList<String>();
String Line;
try {
String line = br.readLine();
do {
dataList.add(Line);
line = br.readLine();
}
while (!line.isEmpty());
br.close ();
}
catch (Exception e) {
e.printStackTrace();
}
String[] dataArr = new String[dataList.size()];
dataArr = dataList.toArray(dataArr);
return dataArr; // Returns an array containing the separate lines of the file
}
方法2:
public void addNewUser (String username, String password){
String[] dataArr = readFile(); // Read in the list of profiles and store it in an array
ArrayList<String> dataAL = new ArrayList<String>(Arrays.asList(dataArr)); // store array of profiles as ArrayList
dataAL.add(username + "\t" + password);
}
答案 0 :(得分:22)
你可能在这里得到空指针
while (!line.isEmpty());
将其更改为
while(line!=null && !line.isEmpty())
如果你注意了异常的堆栈跟踪,你应该看到引发异常的确切行
答案 1 :(得分:1)
如果到达流的末尾,BufferedReader.readLine()将返回null。所以你想要
while (line != null && !line.isEmpty())
答案 2 :(得分:0)
将try
块的正文更改为:
String line = br.readLine();
while (line != null) {
dataList.add(Line);
line = br.readLine();
}
br.close ();
如果要忽略空行,请将其更改为:
String line = br.readLine();
while (line != null) {
if (!line.isEmpty()) {
dataList.add(Line);
}
line = br.readLine();
}
br.close ();
到目前为止提供的其他答案将在第一个空行停止阅读。 (如果您没有空行,则无需拨打isEmpty()
。)
答案 3 :(得分:0)
我不明白为什么要在readFile方法中向dataList添加空值。无论如何,我已经重构了你的代码:
方法1 :
public ArrayList<String> readFile(){
ArrayList<String> dataList = new ArrayList<String>();
try {
//File & File Reader/Stream Initialization Logic
while(line = br.readLine() != null && !line.isEmpty()) {
dataList.add(line);
}
} catch (IOException IOE) {
//IO Exception Handling
} catch (Exception e) {
//General Exception Handling
} finally {
//close the reader/streams here
}
return dataList;
}
方法2 :
public void addNewUser (String username, String password){
ArrayList<String> dataAL = readFile();
dataAL.add(username + "\t" + password);
}