关于.hasNext()与.next()引发无限while循环及回文检测作业的咨询
解决Scanner.hasNext()导致的无限循环问题,实现回文检测方法
嘿,我刚帮不少入门编程的同学踩过这个坑!你遇到的无限循环,问题出在Scanner.hasNext()这个方法的特性上——当你从控制台读取输入时,它会一直阻塞等待用户输入下一个内容,根本不会自动“知道”你已经输完所有单词了,所以循环就停不下来啦。
下面给你两种实用的解决方案,完全贴合你的作业需求:
方案一:先输入总单词数,再逐个读取(最适合作业场景)
这种方式让用户先告诉程序要输入多少个单词,循环次数固定,彻底避免无限循环。代码实现如下:
import java.util.Scanner; public class PalindromeChecker { public static void main(String[] args) { palindromeCheck(); } public static void palindromeCheck() { Scanner scanner = new Scanner(System.in); System.out.print("请输入要检测的单词总数:"); int totalWords = scanner.nextInt(); scanner.nextLine(); // 吃掉输入总数后的换行符,防止影响后续单词读取 int palindromeCount = 0; for (int i = 0; i < totalWords; i++) { System.out.print("请输入第" + (i+1) + "个单词:"); String word = scanner.nextLine().trim(); // 判断是否为回文 boolean isPalindrome = true; int left = 0; int right = word.length() - 1; while (left < right) { // 如果需要忽略大小写,就把字符转成小写再比较 // if (Character.toLowerCase(word.charAt(left)) != Character.toLowerCase(word.charAt(right))) { if (word.charAt(left) != word.charAt(right)) { isPalindrome = false; break; } left++; right--; } if (isPalindrome) { System.out.println(word); palindromeCount++; } } // 输出统计结果 System.out.println("There are " + palindromeCount + " palindromes out of " + totalWords + " words provided by user"); scanner.close(); } }
方案二:用结束标记终止输入(更灵活的用户交互)
如果不想让用户先输入总数,可以约定一个结束标记(比如输入quit),用户输入这个标记时就停止读取,代码如下:
import java.util.Scanner; public class PalindromeChecker { public static void main(String[] args) { palindromeCheck(); } public static void palindromeCheck() { Scanner scanner = new Scanner(System.in); System.out.println("请输入单词(输入quit结束输入):"); int totalWords = 0; int palindromeCount = 0; while (true) { String word = scanner.nextLine().trim(); // 遇到quit就终止循环 if (word.equalsIgnoreCase("quit")) { break; } // 跳过空输入 if (word.isEmpty()) { System.out.println("请输入有效的单词哦!"); continue; } totalWords++; // 回文判断逻辑和上面一致 boolean isPalindrome = true; int left = 0; int right = word.length() - 1; while (left < right) { if (word.charAt(left) != word.charAt(right)) { isPalindrome = false; break; } left++; right--; } if (isPalindrome) { System.out.println(word); palindromeCount++; } } System.out.println("There are " + palindromeCount + " palindromes out of " + totalWords + " words provided by user"); scanner.close(); } }
为什么原来的代码会无限循环?
简单说,Scanner.hasNext()在读取控制台输入时,会一直等待新的输入内容,直到你手动发送EOF(文件结束)信号:Windows按Ctrl+Z再回车,Mac/Linux按Ctrl+D。但这种方式对新手来说太不友好了,作业里也很少这么要求,所以上面两种明确结束条件的方法更合适。
另外,回文判断的逻辑我也帮你写好了,如果作业要求忽略大小写,只需要把字符转成小写再比较就行(代码里有注释提示)。
内容的提问来源于stack exchange,提问作者user9743667
相关产品推荐
相关产品推荐

