Scanner小问题

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小问题)