【问题标题】:How do I call the readStudents method?如何调用 readStudents 方法?
【发布时间】:2020-03-15 13:07:56
【问题描述】:
import java.io.*;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Probability {
   public static void main(String[] args)throws FileNotFoundException {

      String fileName;

      Scanner input = new Scanner(System.in);

      System.out.println("Please enter the file name: ");
      fileName = input.nextLine();

      System.out.println("How many students do you have listed in the file?");
      int numStudents = input.nextInt();

      input.close();

      Student[] students = new Student[numStudents];

      //readStudents(students, numStudents, fileName);
      // calls the readStudents method

      //Student myStudent = new Student(name, gpa);
      //System.out.println(myStudent);
      // creates and prints an object of the Student class

      for(int i = 0; i < students.length; i++){
         System.out.println("students [" + i + "] = " + students[i]);
      } // for

   } // main

   public static void readStudents(Student[] students, int numStudents, String fileName)throws FileNotFoundException {

      Scanner fin = new Scanner(new File(fileName));

      while(fin.hasNext()){
         String name = fin.next();
         double gpa = fin.nextDouble();
         students[0] = new Student(name, gpa);
      } // while

      fin.close();

   } // readStudents

} // class

我正在尝试从这个数据文件中读取:datafile.txt

艾米 3.5

史蒂文 3.2

奥斯卡 3.8

蒂姆 2.7

安 2.1

吉米 3.9

我也在用这个程序:

public class Student {

      private String name;
      private double gpa;

   public Student(String name, double gpa){

      this.name = name;
      this.gpa = gpa;

   } //Student

   public String getName(){
      return name;
   }
   public double getGPA(){
      return gpa;
   }

   public void setName(){
      this.name = name;
   }
   public void setGPA(){
      this.gpa = gpa;
   }

   public String toString(){
      return("The student's name is " + name + "\n" + "The student's grade point average is " + gpa);
   }

} //class

你可以看到我试过了 //readStudents(students, numStudents, fileName);

Student myStudent = new Student(name, gpa);
System.out.println(myStudent);

但两者都不起作用。

当我尝试//readStudents(students, numStudents, fileName); 时,这是我收到的错误消息:

Exception in thread "main" java.io.FileNotFoundException: datafile (The system cannot find the file specified)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:220)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:158)
    at java.base/java.util.Scanner.<init>(Scanner.java:639)
    at Probability.readStudents(Probability.java:44)
    at Probability.main(Probability.java:29)

当我尝试时

Student myStudent = new Student(name, gpa);
System.out.println(myStudent);

这是我收到的错误消息:

Probability.java:32: error: cannot find symbol
      Student myStudent = new Student(name, gpa);
                                      ^
  symbol:   variable name
  location: class Probability
Probability.java:32: error: cannot find symbol
      Student myStudent = new Student(name, gpa);
                                            ^
  symbol:   variable gpa
  location: class Probability
2 errors

这是我的教授希望我完成的:

使用以下属性实现一个名为“Student”的类:

名称:字符串类型

gpa: 双重类型

还有以下方法:

一个构造函数Student(String name, double gpa)

每个属性的getter和setter

toString():在屏幕上打印类的属性(每行一个属性)

使用以下方法在单独的类中编写一个主方法:

public static void readStudents(Student[] students, int numStudents, String fileName):接受学生数据文件的名称,并返回一个包含文件中学生的一维数组。

main方法应该:

询问用户有多少学生(1pts)和数据文件的名称,然后调用 readStudents 从数据文件中获取学生列表。 显示数组。

【问题讨论】:

    标签: java arrays methods parameters


    【解决方案1】:

    好的,因此您的文件未找到异常可能是由于您尝试打​​开的文件的文件路径不正确。您正在尝试打开“datafile.txt”,但它在您的目录结构中的什么位置?如果它位于项目的根目录中,则意味着 './datafile.txt'(即在当前目录中查找 datafile.txt)的 'datafile.txt' 将起作用。

    但是,假设您在项目的根目录中有一个名为“data”的文件夹,并且您的 datafile.txt 位于此文件夹中。现在要打开这个文件,您需要一个来自项目根目录的相对路径,即“data/datafile.txt”(与“./data/datafile.txt”相同)。

    name 和 gpa 的其他错误“找不到符号”是由于您没有在 main 中定义变量 name 和 gpa 以在 Student 构造函数中引用。你需要类似的东西:

    String name = "the_name_you_want";
    double gpa = 4.0;
    

    之前您的构造函数能够像那样使用 name 和 gpa。

    您也可以像这样调用构造函数:

    Student a = new Student("a", 4.0);
    

    或者,如果您提供默认 Student 构造函数,则可以将这些成员设置在默认学生对象上:

    将默认学生构造函数添加到您的学生班级,即

    public Student(){}
    

    ^^请注意,这将是您当前构造函数的补充,该构造函数由于称为 构造函数重载 的功能而受支持。

    现在你可以像这样培养一个学生:

    Student a = new Student();
    a.name = "a";
    a.gpa = 4.0;
    

    ALSO:您的 readStudents 循环只会给您一个包含一个学生的数组,因为您只会将 array[0] 设置为一个新学生。试试这个:

    int i = 0;
    while (fin.hasNext()) {
        String name = fin.next();
        double gpa = fin.nextDouble();
        students[i++] = new Student(name, gpa);
    }
    

    【讨论】:

    • 感谢您的帮助。我喜欢你的建议,但教授希望我能够从数据文件中获取名称和 gpa 值
    【解决方案2】:

    您在正确的轨道上,除了一些修改。如其他答案所述,找不到文件是因为提供了错误的文件路径。尝试使用完整的文件路径。对于您的下一个问题,根据您描述的要求,程序应该是这样的:

    public class Probability {
        public static void main(String[] args) throws FileNotFoundException {
            String fileName;
            Scanner input = new Scanner(System.in);
            System.out.println("Please enter the file name: ");
            fileName = input.nextLine();
            System.out.println("How many students do you have listed in the file?");
            int numStudents = input.nextInt();
            input.close();
            Student[] students = readStudents(numStudents, fileName);
            for (int i = 0; i < students.length; i++) {
                System.out.println("students [" + i + "] = " + students[i]);
            }
        }
    
        public static Student[] readStudents(int numStudents, String fileName) throws FileNotFoundException {
            Student[] students = new Student[numStudents];
            Scanner fin = new Scanner(new File(fileName));
            int i=0;
            while (fin.hasNext()) {
                String name = fin.next();
                double gpa = fin.nextDouble();
                students[i] = new Student(name, gpa);
                i++;
            }
            fin.close();
            return students;
        }
    }
    
    

    输出是:

    students [0] = The student's name is Amy
    The student's grade point average is 3.5
    students [1] = The student's name is Steven
    The student's grade point average is 3.2
    students [2] = The student's name is Oscar
    The student's grade point average is 3.8
    students [3] = The student's name is Tim
    The student's grade point average is 2.7
    students [4] = The student's name is Ann
    The student's grade point average is 2.1
    students [5] = The student's name is Jimmy
    The student's grade point average is 3.9
    

    正如您所说,函数 readStudents 应该向调用方法返回一个数组。

    使用以下方法在单独的类中编写一个 main 方法: 公共静态无效readStudents(学生[]学生,int numStudents, String fileName):接受学生数据文件的名称, 返回一个包含文件中学生的一维数组。

    如果将数组作为参数传递给readStudents,则无需将其返回给调用方法,因为java 将通过引用传递数组。这使得这个程序也有效:

    public class Probability {
        public static void main(String[] args) throws FileNotFoundException {
            String fileName;
            Scanner input = new Scanner(System.in);
            System.out.println("Please enter the file name: ");
            fileName = input.nextLine();
            System.out.println("How many students do you have listed in the file?");
            int numStudents = input.nextInt();
            input.close();
           Student[] students = new Student[numStudents];
            readStudents(students,numStudents, fileName);
            for (int i = 0; i < students.length; i++) {
                System.out.println("students [" + i + "] = " + students[i]);
            }
        }
    
        public static void readStudents(Student[] students, int numStudents, String fileName) throws FileNotFoundException {
            Scanner fin = new Scanner(new File(fileName));
            int i=0;
            while (fin.hasNext()) {
                String name = fin.next();
                double gpa = fin.nextDouble();
                students[i] = new Student(name, gpa);
                i++;
            }
            fin.close();
        }
    }
    

    这取决于您认为哪一个适合您的要求。

    【讨论】:

      【解决方案3】:

      您的第一个错误:FileNotFoundException 此错误是由于系统找不到您指定的文件引起的。确保给它正确的路径。您的起始路径很可能是 src 文件夹。

      您的第二个错误:找不到符号 这个错误是因为你在调用构造函数之前没有初始化namegpa。将代码更改为以下内容应该可以解决问题:

          String name = "Student 1";
          double gpa = 3.2;
          Student myStudent = new Student(name, gpa);
          System.out.println(myStudent);
      

      【讨论】:

        猜你喜欢
        • 2014-11-13
        • 2021-12-21
        • 2015-05-17
        • 1970-01-01
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多