Cen*_*mir 0 java java.util.scanner
我是java的新手,我遇到了一个我自己无法解决的问题.我用Google搜索了异常,但问题太具体了,据我所知,所以我发现自己在这里.这是我的问题.
我有一个名为Student的类,它有一些数据成员及其get/set方法:
private String studentNumber;
private String firstName;
private String lastName;
private int age;
private String gender;
private String country;
Run Code Online (Sandbox Code Playgroud)
我创建了一个实例数组作为fallowing:
Student studentList[] = new Student(10);
Run Code Online (Sandbox Code Playgroud)
我有一个数据库(文本文件)作为fallowing
081935 Cengiz rrrrr Male 21 Turkey
082935 Ay?e aaaaa Female 22 England
083935 Onur bbbbb Male 23 Germany
084935 Fatma ccccc Female 24 Cyprus
085935 Ali dddd Male 21 China
086935 Zehra eeee Female 22 Denmark
087935 Murat ffff Male 25 France
088935 Selin ggggg Female 26 Japan
086935 Cengiz hhhh Male 20 Korea
080935 Damla qqqqqq Female 19 Iran
Run Code Online (Sandbox Code Playgroud)
我想要做的是将所有这些信息传递给我的类实例,并尝试实现这一点:
import java.io.*;
import java.util.Scanner;
public class StudentTracker {
private static int counter = 0;
private static Student studentList[];
public static void readFromFile() throws FileNotFoundException {
File file = new File("Database.txt");
Scanner scanner = new Scanner(new FileReader(file));
try {
while (scanner.hasNextLine()){
processLine(scanner.nextLine());
}
} finally {
scanner.close();
}
}
public static void processLine(String line) {
Scanner scanner = new Scanner(line);
scanner.useDelimiter(" ");
if (scanner.hasNext()) {
studentList[counter].setStudentNumber(scanner.next());
studentList[counter].setFirstName(scanner.next());
studentList[counter].setLastName(scanner.next());
studentList[counter].setGender(scanner.next());
studentList[counter].setAge(Integer.parseInt(scanner.next()));
studentList[counter].setCountry(scanner.next());
counter++;
}
else {
System.out.println("Empty or invalid line. Unable to process.");
}
}
public static void main(String[] args) throws FileNotFoundException {
studentList = new Student[10];
readFromFile();
for(int i = 0; i < 10; i++) {
System.out.printf(studentList[i].getStudentNumber(), " ",
studentList[i].getFirstName());
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它会导致以下错误:
Exception in thread "main" java.lang.NullPointerException
at StudentTracker.processLine(StudentTracker.java:28)
at StudentTracker.readFromFile(StudentTracker.java:16)
at StudentTracker.main(StudentTracker.java:68)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,找不到像C-scanf这样的函数,直到第一个空格才能得到输入,所以我找到另一种解析字符串的方法
readFromFile()和processLine函数,但我不确定它们是否按预期工作.
先感谢您
这一行:
studentList = new Student[10];
Run Code Online (Sandbox Code Playgroud)
创建一个包含10个元素的数组.每个元素的值不是Student 对象 ; 它是一个引用 - 该引用将为null,或者对Student对象(或兼容类型)的引用.每个元素都有一个空值开头.
该行不会创建任何Student对象.
Student在设置其属性之前,您需要创建一个实例,例如
if (scanner.hasNext()) {
studentList[counter] = new Student();
studentList[counter].setStudentNumber(scanner.next());
...
Run Code Online (Sandbox Code Playgroud)
要么:
if (scanner.hasNext()) {
Student student = new Student();
student.setStudentNumber(scanner.next());
... fill in the other properties ...
studentList[counter] = student;
...
Run Code Online (Sandbox Code Playgroud)
作为旁注,这一行:
private static Student studentList[];
Run Code Online (Sandbox Code Playgroud)
......不是惯用的宣言.它是有效的,但大多数Java程序员更愿意看到:
private static Student[] studentList;
Run Code Online (Sandbox Code Playgroud)
这样,所有类型信息都保存在一个地方.(我也建议使用一个List<Student>替代,并将其传递给方法而不是使用静态变量,但让我们不要超越自己......)