You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:14:21