Java字符串比较逻辑运算符使用错误导致do-while死循环问题
问题根因分析
核心错误是逻辑运算符选择不符合需求,混淆了逻辑或(||)和逻辑与(&&)的使用场景,违反布尔运算的德摩根定律。
第一次死循环的原因
你写的循环条件 !AMPM.equalsIgnoreCase("AM") || !AMPM.equalsIgnoreCase("PM") 永远为真:
- 当输入为
AM时:!AMPM.equalsIgnoreCase("AM")为假,!AMPM.equalsIgnoreCase("PM")为真,逻辑或只要一个为真整体就为真,循环继续 - 当输入为
PM时:!AMPM.equalsIgnoreCase("AM")为真,!AMPM.equalsIgnoreCase("PM")为假,整体仍为真,循环继续 - 输入其他值时两个条件都为真,循环当然继续
你的需求是「输入既不是AM也不是PM的时候继续循环」,对应的逻辑是两个非判断同时成立才继续循环,应该用逻辑与(&&)而不是逻辑或。
第二次修改后仅AM能跳出的原因
修改后的条件 !AMPM.equalsIgnoreCase("AM") || AMPM.equalsIgnoreCase("PM") 逻辑完全偏离需求:
- 输入
AM时:第一个判断为假,第二个判断为假,整体为假,跳出循环 - 输入
PM时:第一个判断为真,逻辑或整体为真,循环继续
自然只有输入AM能终止循环。
正确写法
有两种等价的写法,可读性都很高:
- 直接对终止条件取反(最直观,符合需求描述)
String AMPM = ""; do { System.out.println("Enter AM or PM: "); AMPM = console.next(); } while (!(AMPM.equalsIgnoreCase("AM") || AMPM.equalsIgnoreCase("PM")));
- 用逻辑与实现(符合德摩根定律等价变形)
String AMPM = ""; do { System.out.println("Enter AM or PM: "); AMPM = console.next(); } while (!AMPM.equalsIgnoreCase("AM") && !AMPM.equalsIgnoreCase("PM"));
内容的提问来源于stack exchange,提问作者Cua
相关产品推荐
相关产品推荐

