1. ホーム
  2. java

[解決済み] Javaメソッドで無駄なリターンを避けるには?

2022-05-13 02:27:01

質問

私は return ステートメントにネストされた for ループは理論的には常に到達することになります。

コンパイラはこれに同意せず return 文の外側に for ループの外側で 私の現在の理解を超えた、このメソッドを最適化するエレガントな方法を知りたいのですが、私が試みた break の実装はどれもうまくいかないようです。

ランダムな整数を生成し、intパラメータとしてメソッドに渡された範囲内で生成された2番目のランダムな整数が見つかるまで繰り返された反復を返す、割り当てからのメソッドが添付されています。

private static int oneRun(int range) {
    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    rInt[0] = generator.nextInt(range); // Inital random number.

    for (int count = 1; count <= range; count++) { // Run until return.
        rInt[count] = generator.nextInt(range); // Add randint to current iteration.
        for (int i = 0; i < count; i++) { // Check for past occurence and return if found.
            if (rInt[i] == rInt[count]) {
                return count;
            }
        }
    }
    return 0; // Never reached
}

どのように解決するのですか?

コンパイラのヒューリスティックでは、決して最後の return . もしそれが決して到達されないと確信するならば、私ならそれを throw に置き換えて、状況を明確にします。

private static int oneRun(int range) {
    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    rInt[0] = generator.nextInt(range); // Inital random number.

    for (int count = 1; count <= range; count++) {
        ...
    }

    throw new AssertionError("unreachable code reached");
}