按照编程接受并卡住了。我得到这个堆栈跟踪:
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at Doing.LessonSeventeen.main(LessonSeventeen.java:23)
同样在第8行,它说"资源泄漏'键盘'永远不会关闭"。
package Doing;
import java.util.Scanner;
public class LessonSeventeen {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in); // <- line 8
String FirstName, LastName, LoginName;
int Grade, IDNum;
double GPA;
System.out.println("What is your first name?");
FirstName = keyboard.next();
System.out.println("What is your last name?");
LastName = keyboard.next();
System.out.println("What is your grade (as a number)");
Grade = keyboard.nextInt();
System.out.println("What is your login name?");
LoginName = keyboard.next();
System.out.println("What is your Student ID number?");
IDNum = keyboard.nextInt();
System.out.println("And finally, what is your GPA? (Up to 4.0");
GPA = keyboard.nextInt();
System.out.println("Your information:");
System.out.println("Login: " + LoginName);
System.out.println("ID: " + IDNum);
System.out.println("Name:" + LastName + ", " + FirstName);
System.out.println("GPA: " + GPA);
System.out.println("Grade: " + Grade);
}
}
答案 0 :(得分:1)
没有关闭stdin没有问题,JVM会为你处理它并且没有资源泄漏。
显然,您在IDE中内置了一些静态分析功能,这些功能正在寻找扫描程序(可能是任何可以触发此功能的东西)关闭,找不到它,并为您生成警告。
Scanner实现Closeable所以它有一个close方法。在主方法的末尾添加一行,如
keyboard.close()
同时将throws Exception
添加到main方法签名,因为close会抛出IOException。再说一次,stdin实际上不会发生什么。扫描程序抛出IOException,因为它处理所有类型的输入流,并且在某些情况下网络问题可能会破坏事物。
这应该会让你的警告消失。
至于堆栈跟踪,你在键盘上输入了什么?您的扫描仪正在调用nextInt,因此它需要一个整数输入。如果你在那里放一个小数点,它就无法处理它。考虑将您的成绩类型更改为BigDecimal。
仅仅因为数字中包含小数点,所以不足以使用浮点类型。浮点适用于某些类型的计算。对于没有涉及计算的情况,您不希望输入的内容与程序显示的内容之间存在任何差异,it's simpler to use BigDecimal。