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对象只能关闭一次,在程序不再有输入需求后关闭流。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,081评论 0 2
  • 50道经典Java编程练习题,将数学思维运用到编程中来。抱歉哈找不到文章的原贴了,有冒犯的麻烦知会声哈~ 1.指数...
    OSET我要编程阅读 7,304评论 0 9
  • 一、set集合【了解】 1.概述 和数学上的集合基本是一样的,特点:不允许有重复元素,可以进行交集,并集,差集的运...
    墨雨love薏雪阅读 754评论 0 0
  • 其实我一贯是反对从地域、从年龄对人进行标签化的处理与批判,无奈的是网络喷子太多,这一类的人通常见不得别人比自己好,...
    武陆柒阅读 1,069评论 0 3

友情链接更多精彩内容