ArrayList<Integer> al = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
//死循环 直到输入0结束
while (true) {
try {
System.out.println("请输入一个数 输入0表示结束");
//如果在此输入一个非int类型的数据 则陷入一个死循环 为何不能重新给i赋值
int i = scanner.nextInt();
if (i != 0) {
al.add(i);
} else
break;
} catch (Exception e) {
// 捕获非int类型的异常
System.out.println("错误 请输入整数");
}
}
通过DEBUG追踪了下。
Scanner最后是调用 public String next(Pattern pattern) 方法获取一个String对象,通过Pattern表示要获取对象的类型。
代码如下
public String next(Pattern pattern) {
ensureOpen();
if (pattern == null)
throw new NullPointerException();
// Did we already find this pattern?
if (hasNextPattern == pattern)
return getCachedResult();
clearCaches();
// Search for the pattern
while (true) {
String token = getCompleteTokenInBuffer(pattern);//尝试获取符合类型的结果
if (token != null) {
matchValid = true;
skipped = false;
return token;
}
if (needInput) //是否需要input数据
readInput();
else
throwFor();
}
}
问题就出在getCompleteTokenInBuffer(pattern)
和
`if (needInput)
readInput();`
首先初次尝试失败后,会判断是否需要input数据,此时你还没有输入数据,因此通过readInput();得到数据的数据,并把needInput设置为了false
然后再次调用getCompleteTokenInBuffer(pattern);
然而调试里面的代码发现,当pattern指定的类型与你实际输入的类型不匹配时,并不会讲needInput设置为false,
查看该方法的说明:
/*
* Returns a "complete token" that matches the specified pattern
*
* A token is complete if surrounded by delims; a partial token
* is prefixed by delims but not postfixed by them
*
* The position is advanced to the end of that complete token
*
* Pattern == null means accept any token at all
*
* Triple return:
* 1. valid string means it was found
* 2. null with needInput=false means we won't ever find it
* 3. null with needInput=true means try again after readInput (意味着这是readInput后的又一次尝试)
*/
private String getCompleteTokenInBuffer(Pattern pattern) {
/*
...
*/
}
因此,当你循环调用next()方法时,只会不停的尝试将你上次输入的数据中获取你想要的int类型数据。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。