Code Fix

初級

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は不要になります。

直し方: Stringvoid にします。

この問題を解いてみる →

パターン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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)