1. 概要

このチュートリアルでは、Java開発プロセスでよくある間違いを見ていきます。 通常、初心者はこの問題に直面します。Javaアプリケーションでreturnステートメントが欠落しているというエラーです。

欠落しているreturnステートメントエラーはコンパイル時エラーです。 コンパイルフェーズ中にスローされます。 最新のIDEは、このエラーをその場で解決します。 したがって、このタイプのエラーは簡単に検出できる傾向があります。

主な原因は次のとおりです。

  • returnステートメントが誤って省略されただけ
  • メソッドは値を返しませんが、メソッドのシグネチャでvoid型が宣言されていません

2. 戻りステートメントがありません

まず、いくつかの例を見ていきます。 これらの例は、誤って省略されたreturnステートメントに関連しています。 次に、メソッドシグネチャに欠落しているvoid型の例を探します。 各例は、Javaの欠落したreturnステートメントエラーを解決する方法を示しています。

2.1. 省略されたReturnステートメント

次に、簡単なpowメソッドを定義しましょう。

public int pow(int number) {
    int pow = number * number;
}

前のコードをコンパイルした結果、次のようになります。

java: missing return statement

この問題を修正するには、pow変数の後にreturnステートメントを追加するだけです。

public int pow(int number) {
    int pow = number * number;
    return pow;
}

したがって、メソッド powを呼び出すと、期待どおりの結果が得られます。

同様に、条件付き構造では、このエラーが発生します。

public static String checkNumber(int number) {
    if (number == 0) {
        return "It's equals to zero";
    }
    for (int i = 0; i < number; i++) {
        if (i > 100) {
            return "It's a big number";
        }
    }
}

上記のコードは入力番号をチェックします。 まず、入力番号を0と比較します。 条件がtrueの場合、文字列値が返されます。 次に、数値が0より大きい場合、内部条件を持つfor-loopが見つかります。 「i」が100より大きい場合、forループ内の条件ステートメントが満たされます。 しかし、負の入力数はどうですか? はい、その通りです。 デフォルトのreturnステートメントがありません。 したがって、コードをコンパイルすると、 java:returnstatementエラーが再び発生します。

したがって、これを修正するには、メソッドの最後にデフォルトのreturnステートメントを配置する必要があります。

public static String checkNumber(int number) {
    if (number == 0) {
        return "It's equals to zero";
    }
    for (int i = 0; i < number; i++) {
        if (i > 100) {
            return "It's a big number";
        }
    }
    return "It's a negative number";
}

2.2. ラムダスでのリターンの欠落

さらに、ラムダを操作すると、このエラーが発生する可能性があります。 関数の場合、このエラーを検出するのは少し難しいかもしれません。 ストリームのmapメソッドは、このエラーが発生する一般的な場所です。 コードを調べてみましょう。

public Map<String, Integer> createDictionary() {
    List<String> words = Arrays.asList("Hello", "World");
    Map<String, Integer> dictionary = new HashMap<>();
    words.stream().map(s -> {dictionary.put(s, 1);});
    return dictionary;
}

前のコードは問題ないようです。 returnステートメントがあります。 返されるデータ型はメソッドのシグネチャと同じです。 しかし、ストリームのmapメソッド内のコードはどうでしょうか。 map メソッドは、引数として関数を想定しています。 この場合、mapメソッド内の辞書にデータを入れるだけです。 その結果、このコードをコンパイルしようとすると、 java:returnstatementエラーが再度発生します。

次に、エラーを解決するために、ストリーム内のmapforEachメソッドに置き換えるだけです。

words.forEach(s -> {dictionary.put(s, 1);});

または、ストリームからマップを直接返します。

dictionary = words.stream().collect(Collectors.toMap(s -> s, s -> 1))

2.3. メソッドシグネチャがありません

最後に、最後のケースは、メソッドシグネチャにリターンタイプを追加できなかった場合です。 その結果、メソッドをコンパイルしようとすると、エラーが発生します。 次のコード例は、この動作を示しています。

public pow(int number) {
    int pow = number * number;
    return pow;
}

戻り型としてintを追加するのを忘れました。 これをメソッドシグネチャに追加すると、このエラーが修正されます。

public int pow(int number) {
    int pow = number * number;
    return pow;
}

3. 結論

この記事では、returnステートメントが欠落している例をいくつか紹介しました。 それがコードにどのように表示されるか、そしてどのように修正できるか。 これは、コードの将来の間違いや、おそらく数分間のコード検査を回避するのに役立ちます。

いつものように、この記事で使用されているすべてのスニペットは、GitHubから入手できます。