missing return statement の原因と直し方
すべての経路で値を返す必要があります。ifだけで分岐したときに漏れる道を可視化します。
エラーメッセージの読み方
Main.java:3: error: not a statement
Main.java- ファイル名
3- 行番号 — javacが異常に気づいた位置。原因の行とは限りません
error- 種別 — コンパイルエラー。実行まで到達しません
not a statement- 内容 — javacが期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 public class Main { 2 static int twice(int n) { 3 n * 2; ^ 4 } 5 public static void main(String[] args) { 6 System.out.println(twice(3)); 7 } 8 }
Main.java:3: error: not a statement
戻り値の型がvoid以外のメソッドは、必ずreturnで値を返す必要があります。returnを忘れると式だけの行として扱われ、単独の式は文として成立しません。
直し方: (空) を return にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 static String grade(int n) { 3 if (n >= 60) { 4 return "pass"; 5 } ^ 6 } 7 public static void main(String[] args) { 8 System.out.println(grade(50)); 9 } 10 }
Main.java:6: error: missing return statement
すべての経路で値を返す必要があります。ifを通らなかった場合の道が塞がっていないと拒否されます。
直し方: (空) を
return "fail"; にします。
パターン3
1 public class Main { 2 static String greet() { ^ 3 System.out.println("hi"); 4 } 5 public static void main(String[] args) { 6 greet(); 7 } 8 }
Main.java:4: error: missing return statement
何も返さないメソッドの戻り値型はvoidです。voidと書けばreturnは不要になります。
直し方: String を void にします。
パターン4
1 public class Main { 2 static int firstEven(int limit) { 3 int i = 0; 4 while (i < limit) { 5 if (i % 2 == 0) { 6 return i; 7 } 8 i++; 9 } ^ 10 } 11 public static void main(String[] args) { 12 System.out.println(firstEven(5)); 13 } 14 }
Main.java:10: error: missing return statement
whileの中で返していても、ループを抜けたあとの経路にreturnが無ければ、その経路の戻り値が保証されません。
直し方: (空) を
return -1; にします。
パターン5
1 public class Main { 2 static String label(int n) { 3 switch (n) { 4 case 1: 5 return "one"; 6 default: 7 System.out.println(n); ^ 8 } 9 } 10 public static void main(String[] args) { 11 System.out.println(label(2)); 12 } 13 }
Main.java:9: error: missing return statement
switch文はif文と違い、javacはcaseの網羅性を保証しません。defaultがあっても中でreturnしなければ経路が塞がりません。
直し方: System.out.println(n); を return "other"; にします。
よくある誤解
「ifで必ず返している」つもりでも通りません。javacは条件の中身を評価せず、全経路を形式的に見ます。
まとめ
missing return statementは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。