Scanner小问题

作者: G_uest | 来源:发表于2019-07-24 23:10 被阅读0次

    nextLine() 问题

    在连续两个输入并且第二个输入是 nextLine() 时,输入数据会产生错误。没有数据或者多了一个空格。

    测试代码

    public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int a = in.nextInt();
            String str1 = in.nextLine();
            String str2 = in.nextLine();
    
            System.out.println(a);
            System.out.println(str1);
            System.out.println(str2);
        }
    

    输入一

    80 str1 str1
    str2
    

    输出一

    80
     str1 str1
    str2
    

    发现输出第一个str前边有空格,即在输入80之后,第一个nextLine() 接收了之后的空格,直到遇到换行符结束。

    输入二

    80
    only str2
    

    输出二

    80
    
    only str2
    

    输入80后,直接换行,这时str1接收了这个换行,并且遇到换行结束,所以str1中只有一个换行符,再次输入会是 str2 的内容

    解决办法

    next()、nextInt()......接收输入以空格为分隔,不能接收换行符
    只有nextLine() 可以接收换行符,并且以换行符为分隔

    输入时使用两个连续的 nextLine() ,第一个nextLine() 用于接收换行或者其他的无效输入,第二个nextLine() 接收有效输入

    close()问题

    在一个程序中,一个scanner对象 close() 之后,使用其他scanner对象输入时,会抛出 NoSuchElementException 异常。

    代码一

    import java.util.Scanner;
    
    public class Demo1 {
    
        public static void main(String[] args) {
                Scanner in = new Scanner(System.in);
                
                int a = in.nextInt();
                System.out.println("a = " + a);
                
                Demo2 d2 = new Demo2();
                d2.scannerTest();
                
                int c = in.nextInt();
                System.out.println("c = " + c);
                
                in.close();
        }
    
    }
    
    class Demo2 {
        public void scannerTest() {
            Scanner in1 = new Scanner(System.in);
            int b = in1.nextInt();
            System.out.println("b = " + b);
            in1.close();
        }
    }
    

    输出

    1
    a = 1
    2
    b = 2
    Exception in thread "main" java.util.NoSuchElementException
        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 test.Demo1.main(Demo1.java:16)
    

    代码二

    // 代码一 中的片段
    Demo2 d2 = new Demo2();
    d2.scannerTest();
    
    // 在 d2 中关闭 in1 后,创建 in2 对象,试图重新打开 System.in 流
    Scanner in2 = new Scanner(System.in);
    // 这一行还是会报错,证明 System.in 流一旦被关闭,就无法再次被打开
    int c = in2.nextInt();
    System.out.println("c = " + c);
    
    in2.close();
    

    结论

    当 in1 调用 close() 后,System.in流将会关闭,而这种关闭将是永久性的,导致之后将不能接受任何数据,从而引发NoSuchElementException的错误,而代码二也证明 System.in 流一旦被关闭,就无法再次被打开

    解决办法

    1. 把Scanner对象设为成员变量
    2. Scanner对象只能关闭一次,在程序不再有输入需求后关闭流。

    相关文章

      网友评论

        本文标题:Scanner小问题

        本文链接:https://www.haomeiwen.com/subject/ikyqrctx.html