InputMismatchException,编程第17课

时间:2014-05-23 15:22:01

标签: java java.util.scanner

按照编程接受并卡住了。我得到这个堆栈跟踪:

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

1 个答案:

答案 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