0Pricing
Java Academy · レッスン

ユーザー入力の検証

無効な入力を適切に処理します

「ユーザー入力の検証」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応の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));
    }
}

型と範囲を組み合わせる

実際の入力検証では、型の確認、範囲の確認、再試行ループを1つの堅牢な処理に組み合わせることがよくあります。

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で空白だけのテキストを拒否する
  • 再利用可能な検証メソッドに切り出す
  • 具体的で分かりやすいエラーメッセージを表示する

よくある質問

「ユーザー入力の検証」レッスンは無料ですか?

はい。「ユーザー入力の検証」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「ユーザー入力の検証」で何を学びますか?

無効な入力を適切に処理します ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「ユーザー入力の検証」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Scannerで入力を読み取る
  2. 数値と行の読み取り
  3. ユーザー入力の検証
  4. BufferedReaderという選択肢
← Java Academyに戻る