这是一个可以用作重复目标的规范问题/答案.这些要求基于每天发布的最常见问题,可根据需要添加.它们都需要相同的基本代码结构才能进入每个场景,并且它们通常彼此依赖.
扫描仪看起来像一个"简单"的类,这是第一个错误的地方.它并不简单,它具有各种非明显的副作用和异常行为,以非常微妙的方式打破了最小惊讶原则.
所以这对于这个课程来说似乎有些过分,但洋葱错误和问题的剥离都很简单,但由于它们的相互作用和副作用,它们非常复杂.这就是为什么每天在Stack Overflow上有很多关于它的问题.
大多数Scanner
问题包括尝试不止一次这些事情.
我希望能够让我的程序在每次上一次输入后自动等待下一个输入.
我想知道如何检测退出命令并在输入该命令时结束我的程序.
我想知道如何以不区分大小写的方式匹配exit命令的多个命令.
我希望能够匹配正则表达式模式以及内置基元.例如,如何匹配看似日期(2014/10/18
)的内容?
我想知道如何匹配可能不容易用正则表达式匹配实现的东西 - 例如,URL(http://google.com
).
在Java世界中,Scanner
是一个特殊情况,它是一个非常挑剔的课程,教师不应该给新学生使用说明.在大多数情况下,教师甚至不知道如何正确使用它.如果在专业的生产规范中使用它几乎没有,所以它对学生的价值是非常值得怀疑的.
使用Scanner
意味着这个问题和答案提到的所有其他事情.Scanner
关于如何解决这些常见问题并不仅仅是因为它Scanner
几乎在所有Scanner
出错的问题中始终存在共病问题.它永远不仅仅是关于next()
vsnextLine()
,这只是该类实现的挑剔的一个症状,在问题询问中的代码发布中总会存在其他问题Scanner
.
答案显示了Scanner
在StackOverflow上使用和询问的99%的案例的完整,惯用的实现.
特别是在初学者代码中.如果您认为这个答案过于复杂,那么Scanner
请先告诉新学生使用的教师,然后再解释其复杂性,怪癖,非明显副作用及其行为的特点.
Scanner
关于最小惊讶原则的重要性以及为什么一致的行为和语义在命名方法和方法论证中很重要,这是一个很好的教学时刻.
您可能永远不会真正看到
Scanner
在专业/商业业务应用程序中使用,因为它所做的一切都是通过其他方式做得更好.真实世界的软件必须比Scanner
允许您编写代码更具弹性和可维护性.真实世界的软件使用标准化的文件格式解析器和文档格式,而不是独立分配中给出的特殊输入格式.