这里不允许使用Void-type错误

时间:2016-12-15 14:11:56

标签: java list treemap

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

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;
    }
}

学生班:

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;
    }
}

课程类:

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;
    }
}

2 个答案:

答案 0 :(得分:3)

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

您必须拥有map.put("someString", new Student("name"))之类的内容,或map.put("someString", student)其中student类型为Student

答案 1 :(得分:2)

put 的想法是 某些放入该地图。

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

您正在使用%d作为参数#34;值&#34; student.setCourses(courses)期望的参数。

该论点是表达式。该表达式的结果将是方法调用的结果。

该方法被定义为不返回任何东西(无效)。

显然没有某事不一样。这就是编译器试图告诉你的。

两种解决方案:

  1. 传递学生对象
  2. 更改方法setCourses()
  3. 像这样:

    put()

    (你最好选择选项1; 2更多是一个肮脏的黑客,本质上是不好的做法)