Java成绩计算代码中输入记录与传递机制的疑问
示例代码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); double avg; String[] name = new String[10]; // 创建一个名为"name"的字符串数组,长度为10 for (int j = 0; j<10; j++) { System.out.println("What is the name of the student?"); name[j] = sc.nextLine(); // 使用nextLine读取完整的输入字符串 System.out.println("What are their test scores?"); avg = calculateAverage(j); System.out.println("Their average is " + avg + ", that is a " + calculateGrade(avg)); } } public static double calculateAverage(int j) { double [][]gradebook = new double[10][5]; Scanner sc = new Scanner(System.in); double sum = 0; for (int v=0; v<5; v++) { gradebook[j][v] = sc.nextDouble(); sum = gradebook[j][v] + sum; } double avg = sum / 5; return avg; } public static String calculateGrade (double avg) { if (avg >= 90 && avg <= 100) { return "A"; } else if (avg >= 80) { return "B"; } else if (avg >= 70) { return "C"; } else if (avg >= 60) { return "D"; } else { return "F"; } } }
用户疑问
疑问:main方法未在后续行直接配置Scanner,为何能接收多个输入?已知calculateAverage内有Scanner,想了解用户输入的多个数字如何传入该方法,是否需在main中直接记录输入,输入是否直接传递至calculateAverage?
解答
关于main无需后续配置Scanner也能接收输入的原因:
calculateAverage方法内部自己创建了Scanner sc = new Scanner(System.in),这个Scanner和main里的Scanner一样,都是读取标准输入流(键盘输入)。只要是基于System.in创建的Scanner,读取的都是同一个输入源,所以即使main里没继续用自己的Scanner,calculateAverage里的Scanner依然能获取到用户的键盘输入。关于分数输入的传递逻辑:
用户输入的分数并不是在main里记录后传递给calculateAverage的,而是直接在calculateAverage方法内部通过它自己创建的Scanner读取的。不过这种写法存在明显问题:每次调用calculateAverage都新建一个Scanner实例,多个Scanner混用容易引发输入错位(比如main里用nextLine读取姓名后,输入流里残留的换行符可能被后续的nextDouble跳过,导致读取异常)。优化建议:
更规范的写法是只在main里创建一个Scanner,然后把它作为参数传递给calculateAverage方法,避免多个Scanner操作同一个输入流。修改后的calculateAverage方法可以是这样:
public static double calculateAverage(int j, Scanner sc) { double [][]gradebook = new double[10][5]; double sum = 0; for (int v=0; v<5; v++) { gradebook[j][v] = sc.nextDouble(); sum = gradebook[j][v] + sum; } double avg = sum / 5; return avg; }
调用的时候改成avg = calculateAverage(j, sc);即可。
内容的提问来源于stack exchange,提问作者ems080

