我被困在某个我无法找到的地方

时间:2018-05-26 07:50:34

标签: java

我不明白为什么我无法从文件中读取。我总是使用 BufferedReader Readline()方法获得 null

TestStudent类应该能够执行以下功能:

使用存储在名为students.txt的文本文件中的学生数据创建名为studentList的Student对象的ArrayList对象(您应该创建此文件,使其最初存储学生姓名和几个学生的ID - 每个学生一行) 允许用户向ArrayList添加与用户请求一样多的新Student对象,确保每个学生都有唯一的学生ID 当用户将新学生添加到列表中时,程序将覆盖students.txt文件,使其包含与新学生以及原始学生相关的数据。 能够在必要时显示完整的学生列表以及现有的学生ID

这是我到目前为止所做的事情。

  import java.util.*;
  import java.io.*;
  import java.io.File;
  import java.io.FileNotFoundException;
  import java.util.Scanner;
  import java.util.ArrayList;

 public class TestStudent {


    public static void main(String[] args) throws IOException {
    File f=new File("C:\\Users\\user1\\Desktop\\Students.txt");
    BufferedWriter bw = new BufferedWriter(new FileWriter(f));
    // FileReader reads text files in the default encoding.
    FileReader fileReader = 
        new FileReader(f);

    // Always wrap FileReader in BufferedReader.
    BufferedReader bufferedReader = 
        new BufferedReader(fileReader);
   //File f=new File("Student.txt");
    Scanner sc=new Scanner(System.in);
    Scanner scan = new Scanner(f);
    ArrayList<Student> studentList = new ArrayList<>(); 
    String cont;
    do {
        System.out.println("Enter Student Name:");
        String name=sc.next();
        System.out.println("Enter Student ID:");
        String id=sc.next();
        bw.write(name);
        bw.write("\t"+id);
        bw.newLine();

        System.out.println("Continue Adding?");
        cont=sc.next();
     }
     while(cont.equalsIgnoreCase("y"));





     while(bufferedReader.readLine() != null){
        String line = bufferedReader.readLine();
        String[] record = line.split("\t");
        Student myStudent =new Student(record[0],record[1]);

        studentList.add(myStudent);
    }

    for(Student st:studentList)
        System.out.println(st.Name+" "+st.Id);

    bw.close();
    scan.close();
    sc.close();

        }
    }

    class Student{

        String Name, Id;                                    
    with default value red

    Student(String string, String string0) {
        System.out.println("s"); 
    }

//Following are Mutators methos
public String getName() {
    return this.Name;

        }

public String getId() {
    return this.Id;
        }


//Following are accessor Methods
public void setName(String s){
    this.Name=s;

 }

public void setID(String ID) {
    this.Id = ID;
}




public String toString() {                                    
        return "Student name is "+getName()+" Student Id is "+getId();

      }

public boolean isValidID() {                                    
        if(getId().length()!=6)
            return false;
            else{
                 for(int i=0;i<getId().length();i++){
                    if(Id.charAt(i)>'9'||Id.charAt(i)<'0')
                        return false;
                    }  
        return true;
      }
   }


   public boolean IDExists(Student other) {                                    
            if(other.getId().equals(this.getId()))
                return true;
            else
                return false;

          }


}

2 个答案:

答案 0 :(得分:0)

问题在于:

while(bufferedReader.readLine() != null){
    String line = bufferedReader.readLine();
     ...
}

readLine()的第一次调用会读取该行,但不会分配它 - 它会丢失。下一次调用readLine()会读取 next 行。

应该是:

String line = null;
while ((line = bufferedReader.readLine()) != null){
   ....
}

这将读取下一行,将其分配给line,然后与null进行比较。

然后,您的学生构造函数被破坏了:

Student(String string, String string0) {
    System.out.println("s"); 
}

您永远不会将stringstring0分配给任何内容,IdName未分配且始终null

您的代码无法编译:

 String Name, Id;                                    
    with default value red

这是语法错误。

了解How to create a Minimal, Complete, and Verifiable example以确保您的代码正常运行,并且您的问题一次只关注一个问题。只需确保单独测试程序的每个部分并确保它实际编译,大部分问题都将消失。

答案 1 :(得分:-1)

您忘记在构造函数

中为新Object分配studentID和studentName
Student(String string, String string0) {
  System.out.println("s");
  id = string;
  name = string0;        
}

并且因为您编写并读取了相同的文件,因此您必须在阅读之前关闭fileWriter

 do {
    // your code
 }
 while(cont.equalsIgnoreCase("y"));
 // close buffer writer before reading
 bw.close()
 String line;
 while((line = bufferedReader.readLine()) != null){

    String[] record = line.split("\t");
    Student myStudent =new Student(record[0],record[1]);

    studentList.add(myStudent);
}