7gugu’s blog

日本分站

Scanner的一个注意事项

序:

最近入坑Java开发,学习到使用scanner获取用户输入,并且发现了一些入门的坑点,在此写一点笔记方便以后查找。

问题代码:

import java.util.*;

public class Mathmatic {

    public static void main(String[] args) {
        Mathmatic math = new Mathmatic();
        int result;
        result = math.compare();
        System.out.println(result);
        result = math.isPrime();
        System.out.println(result);
    }
    
    public int compare() {
        int num1,num2;
        Scanner input = new Scanner(System.in);
        System.out.println("请输入第一个数字:");
        num1=input.nextInt();
        System.out.println("请输入第二个数字:");
        num2=input.nextInt();
                input.close();
        if(num1==num2) {
            return 0;
        }else if(num1>num2) {
            return 1;
        }else if(num1<num2) {
            return -1;
        }
        return 2;
    }
    
    public int isPrime() {
        int prime;
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个数字:");
        prime=input.nextInt();
        for(int i=2;i<prime;i++) {
            if(prime%i==0) {
                return 0;
            }
        }
        return 1;
    }
}

此段代码在运行过程中,如果调用了compare函数之后,再调用isPrime函数,将会报以下错误。

错误定位:

 

        num2=input.nextInt();
             -->input.close();<--

这是因为在函数中,声明了一个scanner对象,并且调用了close方法。这可能是由于所有的scanner类共享一个输入流,当其中一个调用关闭函数的时候,所有的scanner对象都关闭了。

解决方法:

在程序的最后,再使用close方法