@
TOC
刚学习java,我在做练习码Demo的时候总是碰见关于Scanner.nextLine空字符的问题,导致在运行程序时无法在控制台获得录入值,而是直接接收了一个空字符。对于我这种懒人,每次产生这样输入Bug很麻烦,网上搜了很多都是介绍关于Scanner.nextLine()知识点的用法和与Scanner.next()的区别,没有解决方法。于是想把个人的小经验分享一下:
案例
大家都知道,Scanner.nextLine(),是可以录入带空格的字符串,如果之前有过关于Scanner的方法,那么会导致控制台录入失败,具体原因网上先辈们扒的很清楚了,我的理解就是Scanner.nextLine()是会读取控制台的所有内容字符,包括敲下回车键产生的结束符。而其他录入方式在读取到录入的有效内容之前,所有的无效内容会自动跳过(例如空格,Tab键,回车键等产生的无效字符)。所以当之前使用过其他录入方式,录入结束后Enter产生的结束符会留在控制台,此时使用Scanner.nextLine()就会直接接收这个结束符,导致录入直接结束。
例:
结果显示,第一个字符串录入成功,第二次则直接结束了。
方案一
但如果我们改一下,例:
结果为:
结果显示两次录入都成功了。再改一下:
结果为:
可以看到,结果显示两次录入也成功了。
结论:所以如果需求只是要字符串的话,大家可以统一换成Scanner.next();或者统一Scanner.nextLine();就可以避免控制台跳过录入的bug了。
方案二:
如果在代码中,为了满足各种需要,我们就是要分别使用next()和next.line()呢,我们可以这样,先用一个next Line()方法去接收消化掉之前留下的结束符,之后就可以正常录入了。
例:
输出结果:
可以看到结果正确。
结论:在next Line()之前若使用过其他录入方式,则在next Line()方式前先添加一个next Line();
方案三:
(以上确实能解决基本的录入问题,但是当代码量多一些的时候,录入的方式需要出现多次的时候,这样不觉得很麻烦吗?每次要去想一想上一次使用的什么,要不要添加一个next Line(),如果本身不需要添加的时候,而不小心多添加了一个nextLine(),会产生什么样的结果呢,会报空指针异常错误。)
有没有办法弄一个统一通用的录入方式呢?我于是想自己封装一下,但是在这之前需要知道next Line()接收的结束符到底是什么,于是做了如下验证。
我写了一个方法封装Scanner对象,做了如下判断:
结果为:
我们可以看到,接收到的并非是null值,也不是任意一个字符符号也不是空格,而是一个什么都没有的空元素“”。所以,我们可以封装成如下方法:
结果为:
结论:可以通过封装方法,让nextLine()对象自动捕捉到结束符后递归实现有效的next Line()调用。
(第一次写博客,希望对大家有所帮助!谢谢。)