Java使用Scanner对象的输入问题

一、背景描述

今天在使用Java做OJ题目时,死活输入不对,类似如下:

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

然后,输出结果是这样子的:
在这里插入图片描述
我输入了一个整数9,从代码来看,是需要在控制台在输入一个字符串的,可是却直接打印出来了一个“换行”,然后程序就运行结束了!

二、思考分析

程序中调用Scanner对象完成对各种类型数据的输入。

nextInt()方法对于输入的合法的字符,会将其转化为整型,其输入遇到空格或换行结束
nextLine()方法用于输入一个字符串,这个字符串中可以输入包含空格在内的字符串,但是遇到换行就结束输入

分析:输入9,然后换行,nextInt()方法成功获取到9的值,紧接着的nextLine()方法从next()方法读取的那一行接着进行读取,哪一行剩下的只是换行分隔符,所以nextLine()也就结束了,返回的是“”,因此str的值是默认的“”,根本无法输入我们想输入的字符串!

在JDK8的官方文档中:

nextLine():
Advances this scanner past the current line and returns the input that was skipped. This method returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line.

nextInt()方法会读取下一个int型标志的token.但是焦点不会移动到下一行,仍然处在这一行上。当使用nextLine()方法时会读取当前行剩余的所有的内容,包括换行符,然后把焦点移动到下一行的开头(相当于消除掉了换行!)。所以这样就无法接收到下一行输入的String类型的变量。

验证结果如下:

 public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        String str = in.nextLine();
        System.out.println(n);
        System.out.println(str);
        System.out.print(str.equals(""));
    }

最后输出的结果值为true!
在这里插入图片描述

三、解决办法

  1. 如果待输入的字符串中不包含空格的话,可以使用next()方法,不使用nextLine()方法,next()方法一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的“空格,tab,换行”等遇到的结束符(next()的结束符是三种,而nextLine()中只有一种结束符——换行!)。因此,虽然nextInt()有一个换行留了下来,但是next()会将其过滤掉,不影响我们输入字符串。
  2. 但是有时待输入的字符串中包含空格,需要按行为单位输入,此时需要使用nextLine()方法了,那么应对措施就是在使用nextLine()之前再先调用一次nextLine(),使其不在nextInt()哪一行,转入下一行进行读入,这样就可以实现待输入字符串的输入了!

四、总结

  1. next()和nextLine()的区别:

next()和nextLine()的区别:
首先,next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。简单地说,next()查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,所以next方法不能得到带空格的字符串而nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。

  1. nextInt(), nextDouble()等与nextLine()连用时,注意其中一定要再加一个nextLine()
in.nextInt();
in.nextLine();
...
in.nextLine();
...

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值