Javaでメソッドを定義するとき、戻り値があるメソッドには必ず return
文を書く必要があります。このルールを忘れてしまうと、次のようなエラーメッセージが表示されます:
エラー: missing return statement(method must return a result of type ○○)
このエラーは初心者にとって特に分かりづらいものです。見た目にはreturnを書いているつもりでも、すべての分岐にreturn文が存在しなかったり、returnが実行されない可能性があるコードになっているため、コンパイル時に指摘されます。
この記事では、このエラーが発生する原因と修正方法を、初心者向けに分かりやすく解説します。具体的なコード例を示しながら、陥りやすいポイントや防止策も紹介します。
エラーメッセージの意味
エラーメッセージを構成する部分を分解して理解しましょう:
- “method”:メソッドに対してのエラーであることを示しています。
- “must return a result of type ○○”:宣言した型の値を必ず返さなければならない、という意味です。
つまり、戻り値を返す必要があるメソッドでreturnが不足している、またはすべてのコード経路でreturnされていないことを意味します。このエラーが出たら、まず「コードのすべての経路が必ずreturnに到達するか」を確認しましょう。
よくあるエラーのパターンと修正例
パターン①:return文を書き忘れている
エラー例
public class Main {
public static int getNumber() {
int x = 5;
}
}
このコードでは、戻り値としてint
型を指定しているにもかかわらず、return文が存在しないためエラーになります。
修正例
public class Main {
public static int getNumber() {
int x = 5;
return x;
}
}
戻り値がある場合は、処理の最後で必ずreturnを書く必要があります。処理が単純でも忘れないように注意しましょう。
パターン②:すべての分岐でreturnしていない
エラー例
public class Main {
public static String check(int value) {
if (value > 0) {
return "Positive";
}
// それ以外の分岐でreturnがない
}
}
if文の条件がtrueのときだけreturnされていますが、それ以外の条件では値を返さないためエラーになります。
修正例
public class Main {
public static String check(int value) {
if (value > 0) {
return "Positive";
} else {
return "Not positive";
}
}
}
あるいは、elseを省略して末尾にreturnを書く形でも構いません:
public class Main {
public static String check(int value) {
if (value > 0) {
return "Positive";
}
return "Not positive";
}
}
このように、すべての経路で必ずreturnすることが重要です。条件分岐が複数あるときは、returnの抜け漏れに注意しましょう。
複雑な条件分岐での注意点
if-elseが複雑に入り組んでいる場合や、switch文を使う場合は、すべての分岐でreturnされるように気をつける必要があります。
エラー例
public static String getLabel(int code) {
switch (code) {
case 1: return "A";
case 2: return "B";
}
// defaultがなく、他の値でreturnがない
}
修正例
public static String getLabel(int code) {
switch (code) {
case 1: return "A";
case 2: return "B";
default: return "Unknown";
}
}
switch文では一見すべてのケースを網羅しているように見えても、defaultがなければreturnが漏れる可能性があります。必ずdefaultを追加しましょう。
void型と戻り値ありメソッドの違い
Javaでは、戻り値が不要なメソッドには void
を指定します。void
と戻り値ありの型を混同すると、returnの有無を誤解する原因になります。
void型の例
public static void sayHello() {
System.out.println("Hello");
// return文は不要(早期終了用にreturn;は書ける)
}
戻り値が必要な型の例
public static int getNumber() {
return 10; // returnが必須!
}
「このメソッドは値を返す必要があるのか?」を常に意識して、voidと戻り値ありの違いを明確に区別しましょう。
エラーを防ぐためのポイント
- 戻り値のあるメソッドでは必ずreturnを書く
- すべての分岐でreturnがあるか確認する
- voidと戻り値ありの違いを理解する
- switch文や複雑な条件式ではdefaultや最後のreturnを忘れない
- IDEの警告や補完機能を活用し、早めにミスを発見する
returnの書き忘れは単純ですが、実務でも頻繁に発生するエラーです。習慣的に確認することで防止できます。
まとめ
- 「method must return a result of type ○○」は、戻り値の型を返していないときに発生するエラー。
- 原因はreturnの書き忘れや分岐での漏れが多い。
- voidと戻り値ありの違いを理解することが防止の第一歩。
- すべての経路でreturnが行われるように意識すれば解決できます。
次回予告
次回は、「incompatible types: ○○ cannot be converted to ○○」エラーを解説します。型の不一致が原因で発生する代表的なエラーで、初心者にとっても頻出です。型変換やキャストの注意点を詳しく見ていきます。
コメント