В соответствии с оператором, в котором NPE выбрасывает while (s.hasNext())
, наиболее вероятно, что s
является нулевым указателем, вы можете добавить System.out.println(s);
перед этим оператором, чтобы дважды подтвердить его.
И по той причине, что s
равен null
, есть две возможные причины:
- Вы не вызывали
openFile
до readFile
- Исключение выдается при открытии файла.
s
является только декларацией и еще не указал ни на один объект.
Может быть, для лучшей практики вы можете установить, является ли экземпляр null
или нет, прежде чем вызывать его метод. И, насколько я понимаю, readFile
зависит от результата openFile
, возможно, вы можете установить возвращаемое значение openFile
как логическое значение и проверить возвращаемое значение перед дальнейшей операцией открытия файла. Невозможно прочитать файл, который нельзя даже открыть, верно?
import java.io.*;
import java.util.*;
public class Reader {
private Scanner s;
public boolean openFile() {
try {
s = new Scanner(new File("file.txt"));
return true;
} catch (Exception e) {
System.out.println("File not found. Try again.");
return false;
}
}
public void readFile() {
while (s.hasNext()) {
String a = s.next();
String b = s.next();
String c = s.next();
int d = s.nextInt();
int e = s.nextInt();
int f = s.nextInt();
}
}
Вызывающий может сделать что-то вроде следующего:
Reader reader = new Reader();
if (reader.openFile())
reader.readFile();