Void-type not allowed here 错误

Void-type not allowed here error

我正在尝试将从文件中读取的这些数据添加到我的地图中。我的地图是一个树形图 TreeMap<String, Student>,其中 Student 在另一个 class 中。我正在尝试使用代码 map.put(formatSNumber, student.setCourses(courses)); 将读取的文件元素添加到我的地图中,但我一直遇到 void type not allowed here 错误。

sNumber = Integer.parseInt(Breader.readLine());
formatSNumber = String.format("%03d", sNumber);
hours = Integer.parseInt(Breader.readLine());
grade = Double.parseDouble(Breader.readLine());
Student student = map.get(formatSNumber);
Course course = new Course(hours, grade);
List<Course> courses = student.getCourses();
courses.add(course);
map.put(formatSNumber, student.setCourses(courses));
end = Breader.ready();

这是我的完整代码:

import java.io.*;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.Iterator;
import java.util.List;
public class FinalProgram {
    public static void main(String[] args) throws IOException {
        String nameFile = " ";
        String classFile = " ";
        TreeMap<String, Student> map = new TreeMap<>();
        Scanner input = new Scanner(System.in);

        try {
            System.out.print("Enter the Name file(c:filename.txt): ");
            nameFile = input.nextLine();
        } catch(IllegalArgumentException e) {
            System.out.printf("Invalid input. Please enter"
                    + " filename in the form of "
                    + "c:filename.txt\n", e.getMessage());
        }
        nameReader(nameFile, map);

        try {
            System.out.print("Enter the Class file(c:filename.txt): ");
            classFile = input.nextLine();
        } catch(IllegalArgumentException e) {
            System.out.printf("Invalid input. Please enter"
                    + " filename in the form of "
                    + "c:filename.txt\n", e.getMessage());
        }
        classReader(classFile, map);
    }

    private static void nameReader(String file, TreeMap<String, Student> map)
            throws IOException {

        String nameFile = file;
        int sNumber = 0;
        String formatSNumber = " ";
        String sName = " ";

        //Instantiate FileReader and BufferedReader
        FileReader freader = new FileReader(nameFile);
        BufferedReader Breader = new BufferedReader(freader);
        boolean end = Breader.ready();

        do {
            sNumber = Integer.parseInt(Breader.readLine());
            formatSNumber = String.format("%03d", sNumber);
            sName = Breader.readLine();
            Student student = new Student(sName);
            map.put(formatSNumber, student);
            end = Breader.ready();
        } while(end);
        Iterator<String> keySetIterator = map.keySet().iterator();
        while(keySetIterator.hasNext()) {
            String key = keySetIterator.next();
            System.out.println("key: " + key + " value: " + map.get(key).getName());
        }
    }
    private static void classReader(String file, TreeMap<String, Student> map) 
            throws IOException {
        String classFile = file;
        int sNumber = 0;
        String formatSNumber = " ";
        int hours = 0;
        double grade = 0.0;
        double points = grade * hours;
        double GPA = points / hours;

        //Instantiate FileReader and BufferedReader
        FileReader freader = new FileReader(classFile);
        BufferedReader Breader = new BufferedReader(freader);
        boolean end = Breader.ready();

        do {
            sNumber = Integer.parseInt(Breader.readLine());
            formatSNumber = String.format("%03d", sNumber);
            hours = Integer.parseInt(Breader.readLine());
            grade = Double.parseDouble(Breader.readLine());
            Student student = map.get(formatSNumber);
            Course course = new Course(hours, grade);
            List<Course> courses = student.getCourses();
            courses.add(course);
            map.put(formatSNumber, student.setCourses(courses));
            end = Breader.ready();
        } while(end);

        points = grade * hours;
        GPA = points / hours;
    }
}

学生class:

import java.util.ArrayList;
import java.util.List;
public class Student {
    private String name = " ";
    private List<Course> courses = new ArrayList<>();
    public Student(String name) {
        this.name = name;
    }
    public Student(String name, List courses) {
        this.name = name;
        this.courses = courses;
    }
    public List getCourses() {
        return courses;
    }
    public void setCourses(List courses) {
        this.courses = courses;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

课程class:

public class Course {
    private int hours = 0;
    private double grade = 0.0;
    public Course(int hours, double grade) {
        this.hours = hours;
        this.grade = grade;
    }
    public void setHours(int hours) {
        this.hours = hours;
    }
    public int getHours() {
        return hours;
    }
    public void setGrade(double grade) {
        this.grade = grade;
    }
    public double getGrade() {
        return grade;
    }
}

map.put(formatSNumber, student.setCourses(courses)) 中的第二个参数必须是 Student 类型。 student.setCourses(courses) 是一个 setter 方法,return 类型为 void,即没有 return。这不匹配。

你必须有类似 map.put("someString", new Student("name")) 的东西,或者 map.put("someString", student) 其中 studentStudent.

类型

put 的想法是 put something into that Map.

更准确地说,您通常提供(非空)键和值对象。

您正在使用 student.setCourses(courses) 作为 put() 期望的 "value" 参数的参数。

该参数是一个表达式。该表达式的结果将是 方法调用 .

的结果

该方法被定义为而不是return任何东西(即无效)。

显然 nothingsomething 不同。这就是编译器试图告诉你的。

两种解决方案:

  1. 传递一个学生对象
  2. 更改方法 setCourses()

像这样:

Student setCourses(... {
....
  return this;
}

(你最好选择选项 1;2 更像是一个肮脏的 hack,本质上是糟糕的做法)