Java代码else代码块中Boolean类型变量keepGoing值未改变的原因是什么?
问题根因
- 核心错误:代码中用
StringBuilder类型的check实例直接调用equals方法和字符串"yes"比较。StringBuilder没有重写Object的equals方法,该方法默认比较两个对象的内存地址,而非存储的内容。check是StringBuilder实例,"yes"是String常量池中的对象,二者内存地址永远不同,所以比较结果永远是false,keepGoing自然不会变更为true。 - 额外逻辑隐患:
StringBuilder实例定义在循环外部,每次调用append都会拼接历史输入内容,就算后续修复了比较逻辑,多次输入后拼接的内容也会和预期的"yes"不符。
修复方案
直接废弃不必要的StringBuilder,用String类型接收用户输入直接比较即可,修改后else块代码如下:
else { System.out.println("it is not valid"); System.out.println("do you want to continue: yes/no"); String continueInput = display.next(); keepGoing = continueInput.equals("yes"); }
如果确实需要使用StringBuilder,需要先调用toString()方法转成字符串再比较,同时每次循环前清空StringBuilder中的历史内容:
// 循环内每次使用前清空历史内容 check.setLength(0); check.append(display.next()); keepGoing = check.toString().equals("yes");
内容的提问来源于stack exchange,提问作者Naeem Sadat
相关产品推荐
相关产品推荐

