2

配列からユーザー入力を取得したいが、args[0]私 (ユーザー) がそれを定義するのを忘れた場合に備えて、プロンプトが表示されるようにしたい場合はどうすればよいですifか?空かどうか、または例外をキャッチしますか? で、これか

public class Stuff {
    static Scanner input = new Scanner(System.in);
    public static void main(String[] args) {
        String foo;
        if(args.length > 0) {
            foo = args[0];
        }
        else {
            foo = getString("Input? ");
        }
    }
    public static String getString(String prompt) {
        System.out.print(prompt + " ");
        String answer = input.nextLine();
        return answer;
    }   
}

より良いか悪いか

public class Stuff {
    static Scanner input = new Scanner(System.in);
    public static void main(String[] args) {
        String foo;
        try {
            foo = args[0];
        }
        catch(ArrayIndexOutOfBoundsException e) {
            foo = getString("Input? ");
        }
    }
    public static String getString(String prompt) {
        System.out.print(prompt + " ");
        String answer = input.nextLine();
        return answer;
    }   
}
4

6 に答える 6

6

ifステートメントではまだ存在しないインデックスにアクセスしているため、最初の例でも例外がスローされます。

ifステートメントを使用する場合は、配列の長さがアクセスしようとしているインデックスよりも大きいことを確認する必要があります。次に例を示します。

if(args.length > 0)
    foo = args[0];
于 2012-06-29T09:41:40.843 に答える
4

この場合、IMO、if-elseの方が優れています/高速です。

例外のスローは、メソッド内にいて、呼び出し元に何か問題が発生したことを伝えたい場合に使用され、戻り値ではそれを実行できません。

しかし、ジョンテイラーが言ったように、あなたのifステートメントはそのようには機能しません。

于 2012-06-29T09:43:19.260 に答える
4

args.length読むのではなくテストする必要がありますargs[0]

ただし、そのエラーは別if/elseとして、次の理由から使用することをお勧めします。

  • コードをより明確にします
  • パフォーマンスが向上します(ただし、この場合は関係ありません)
  • 例外的な条件はありません (「ユーザー エラー」など、状況によっては args 配列が空になることが予想されるため、コードでそれを処理できる必要があります)。例外のスローは、発生してはならない例外的な状況のために予約する必要があります。
于 2012-06-29T09:49:04.250 に答える
2

本当に必要なのは、1 行のコードだけです。

final String foo = args.length > 0? args[0] : getString("Input? ");
于 2012-06-29T09:45:26.590 に答える
1

ifブロックを使用して、配列が空であるかどうかを確認します。これは簡単で高速です。

于 2012-06-29T09:41:57.233 に答える
1

Jon Taylor によって証明された修正を考えると、if を含むバージョンを優先します。

速度の向上だけでなく (あなたの例では目立たないと思います)、 if を含むコードがその意図をよりよく説明し、コードの将来のメンテナンスを簡素化するためです。

于 2012-06-29T09:45:52.687 に答える