java中nextLine()无法读入字符串的问题

问题描述

今天在写算法题时遇到一个问题,首先我调用了nextInt方法读取一个整数,随之又调用了nextLine方法读取一行,发现nextLine方法读取的值为空,代码如下:
此处nextInt方法在“一”处调用,nextLine方法在“二”处调用

    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        Stack<Integer> stack=new Stack<>();
        int n=in.nextInt(); //一
        String[] elems=in.nextLine().split(" ");//二
        for(int i=0;i<n;i++)
        {
            stack.add(Integer.parseInt(elems[i]));
        }
        Stack<Integer> help=new Stack<>();
        while(!stack.isEmpty()){
            int cur=stack.pop();
            while(!help.isEmpty()&&help.peek()>cur){
                stack.add(help.pop());
            }
            help.add(cur);
        }
        while(!help.isEmpty()){
            System.out.print(help.pop()+" ");
        }
    }

代码逻辑是没有问题,简单调试了一下,发现“二”处的elems读取值为空

问题原因

在网上查找了相关资料才了解到,nextInt方法调用时,根据当时输入的数据,Enter作为它的结束符,并且该方法不会将Enter这个结束符从缓存中清除,当之后调用nextLine方法时,nextLine方法以Enter作为结束标志,不会再读取其他数据了。

具体描述如下:

next()与nextLine()的区别 :

  • next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其过滤掉;只有在读取到有效字符之后,next()方法才将其后的空格键、Tab键或Enter键等视为结束符;所以next()方法不能得到带空格的字符串。
  • nextLine()方法字面上有扫描一整行的意思,它的结束符只能是Enter键,即nextLine()方法返回的是Enter键之前没有被读取的所有字符,它是可以得到带空格的字符串的。
  • next()方法在扫描到空白符的时候会将前面的数据读取走,但会丢下空白符“\r”在缓冲区中
  • nextLine()方法在扫描的时候会将扫描到的空白符一同清理掉

解决方法

其实也好解决,在每一个 next()、nextDouble() 、nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。
即:

        //...
        int n=in.nextInt(); //一
        nextLine();
        String[] elems=in.nextLine().split(" ");//二
        //...
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值