0Pricing
Java Academy · 课时

验证用户输入

妥善处理无效输入

验证用户输入 是 CoddyKit 上的免费 Java Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

永远不要盲信输入

用户可能输入错误内容:在应该输入数字的地方输入字母、输入空白内容,或输入超出范围的值。可靠的程序会验证输入,并在输入无效时要求用户重新输入,而不是直接崩溃。

本课将介绍使用 Scanner 实现平稳输入验证的模式。

读取前先检查

最简单的保护方式是使用 hasNextInt()。只有实际存在整数时,才读取它。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner("42");
        if (scanner.hasNextInt()) {
            System.out.println("Got: " + scanner.nextInt());
        } else {
            System.out.println("Please enter a number");
        }
        scanner.close();
    }
}

循环直到输入有效

重试循环会不断请求输入,直到获得有效整数。如果令牌错误,请使用 next() 将其丢弃,然后继续。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner("abc xyz 50");
        int value = -1;
        while (scanner.hasNext()) {
            if (scanner.hasNextInt()) {
                value = scanner.nextInt();
                break;
            }
            scanner.next();
        }
        System.out.println("Accepted: " + value);
        scanner.close();
    }
}

检查范围

除了类型之外,数值通常还必须处于某个范围内。请先读取数值,然后在接受它之前进行验证。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner("7");
        int n = scanner.nextInt();
        if (n >= 1 && n <= 10) {
            System.out.println("Valid: " + n);
        } else {
            System.out.println("Out of range");
        }
        scanner.close();
    }
}

解析时使用 try-catch

另一种方式是先读取整行,再解析它,并捕获无效文本引发的 NumberFormatException。这样可以让缓冲区保持简单。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner("notanumber");
        String line = scanner.nextLine();
        try {
            int n = Integer.parseInt(line.trim());
            System.out.println("Parsed: " + n);
        } catch (NumberFormatException e) {
            System.out.println("Invalid number: " + line);
        }
        scanner.close();
    }
}

验证非空文本

对于文本输入,请拒绝空白内容。isBlank() 会对空字符串或仅包含空白字符的字符串返回 true。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner("   ");
        String name = scanner.nextLine();
        if (name.isBlank()) {
            System.out.println("Name cannot be empty");
        } else {
            System.out.println("Hello, " + name);
        }
        scanner.close();
    }
}

验证选项

对于菜单选项,请先确认该值属于允许的选项之一,然后再对它执行操作。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner("y");
        String choice = scanner.next().toLowerCase();
        if (choice.equals("y") || choice.equals("n")) {
            System.out.println("You chose: " + choice);
        } else {
            System.out.println("Please enter y or n");
        }
        scanner.close();
    }
}

可复用的验证器方法

将验证逻辑提取到一个方法中,以便重复使用。这里的方法会检查年龄是否处于合理范围内。

public class Main {
    static boolean isValidAge(int age) {
        return age >= 0 && age <= 120;
    }

    public static void main(String[] args) {
        System.out.println(isValidAge(30));
        System.out.println(isValidAge(-5));
    }
}

结合类型和范围验证

实际的验证通常会将类型检查、范围检查和重试循环结合到一个可靠的例程中。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner("abc 200 45");
        int valid = -1;
        while (scanner.hasNext()) {
            if (scanner.hasNextInt()) {
                int n = scanner.nextInt();
                if (n >= 1 && n <= 100) {
                    valid = n;
                    break;
                }
            } else {
                scanner.next();
            }
        }
        System.out.println("Final: " + valid);
        scanner.close();
    }
}

清晰的错误消息

良好的验证还应向用户提供有帮助的反馈。请准确说明哪里出错以及应当满足什么要求,而不是只显示笼统的失败提示。

public class Main {
    static String validate(String input) {
        if (input.isBlank()) return "Input is empty";
        if (!input.matches("\\d+")) return "Only digits allowed";
        return "OK";
    }

    public static void main(String[] args) {
        System.out.println(validate(""));
        System.out.println(validate("12a"));
        System.out.println(validate("123"));
    }
}

验证策略

使用 hasNext 系列方法或 try-catch 检查类型,检查范围和是否为空,循环直到输入有效,并始终清楚地解释错误。

快速检查

测试您对输入验证的理解。

回顾

您已经学会了如何平稳地验证输入:

  • 使用 hasNextInt 进行保护,或在 try-catch 中进行解析
  • 使用重试循环,并通过 next() 丢弃错误的令牌
  • 检查范围,并使用 isBlank 拒绝空白文本
  • 提取可复用的验证器方法
  • 提供清晰、具体的错误消息

常见问题解答

「验证用户输入」课时是免费的吗?

是的 — 「验证用户输入」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「验证用户输入」这节课中我会学到什么?

妥善处理无效输入 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「验证用户输入」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 Scanner 读取输入
  2. 读取数字与行
  3. 验证用户输入
  4. BufferedReader 替代方案
← 返回 Java Academy