
本文旨在详细解释Java程序中如何使用Scanner类接收多个用户输入,并通过一个简单的成绩计算示例,剖析输入数据流的运作机制,帮助读者理解Scanner对象在不同方法间的交互,以及如何正确地从标准输入读取数据。
在Java编程中,Scanner 类是用于从各种输入源(例如键盘、文件等)读取数据的关键工具。理解 Scanner 的工作原理,对于编写能够与用户交互的程序至关重要。本文将通过一个成绩计算的示例,深入探讨 Scanner 如何在不同的方法之间传递和处理输入数据。
Scanner 类通过创建一个 Scanner 对象来工作,该对象与特定的输入流相关联。在示例代码中,Scanner sc = new Scanner(System.in); 创建了一个 Scanner 对象 sc,它与标准输入流 System.in (通常是键盘) 相关联。
Scanner 类提供了一系列方法,用于从输入流中读取不同类型的数据,例如 nextLine() 用于读取字符串,nextDouble() 用于读取双精度浮点数,nextInt() 用于读取整数等等。
立即学习“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];
for (int j = 0; j<10; j++)
{
System.out.println("What is the name of the student?");
name[j] = sc.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); // 注意:这里创建了新的Scanner对象
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 方法:
calculateAverage 方法:
calculateGrade 方法:
在 calculateAverage 方法中,sc.nextDouble() 方法负责从标准输入读取一个双精度浮点数。当程序执行到这一行时,它会暂停并等待用户输入。用户可以输入一个数字,然后按下回车键。Scanner 对象会将输入的数字解析为 double 类型,并将其赋值给 gradebook[j][v]。
关键在于,Scanner 对象维护了一个内部的“指针”,指向输入流中下一个要读取的位置。每次调用 nextDouble()、nextLine() 等方法时,Scanner 对象都会从当前位置开始读取数据,并将指针移动到下一个位置。
容易混淆的地方:
代码中在calculateAverage 方法里又创建了一个新的Scanner对象。实际上,更好的做法是在main方法中创建唯一的Scanner对象,然后将其作为参数传递给calculateAverage方法,避免资源浪费和潜在的输入流问题。
修改后的代码示例:
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];
for (int j = 0; j<10; j++)
{
System.out.println("What is the name of the student?");
name[j] = sc.nextLine();
System.out.println("What are their test scores?");
avg = calculateAverage(j, sc); // 将Scanner对象传递给calculateAverage
System.out.println("Their average is " + avg + ", that is a " + calculateGrade(avg));
}
sc.close(); // 记得关闭Scanner对象
}
public static double calculateAverage(int j, Scanner sc) { // 接收Scanner对象作为参数
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;
}
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";
}
}
}注意事项:
Scanner 类是 Java 中用于读取用户输入的重要工具。理解 Scanner 的工作原理,特别是它如何维护输入流的“指针”,以及如何在不同的方法之间共享 Scanner 对象,对于编写健壮和高效的 Java 程序至关重要。 通过修改示例代码,我们学习了如何正确地在方法间传递 Scanner 对象,并避免了重复创建 Scanner 对象的问题。同时,我们也强调了在使用 Scanner 类时需要注意的一些事项,例如关闭 Scanner 对象、处理异常等。
以上就是Java中方法如何接收多个输入:深入解析Scanner类的使用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号