Code Fix

初級

unexpected return value の原因と直し方

voidメソッドは値を返せません。戻り値型の宣言と実際のreturnを一致させる考え方を整理します。

エラーメッセージの読み方

Main.java:3: error: incompatible types: unexpected return value
Main.java
ファイル名
3
行番号 — javacが異常に気づいた位置。原因の行とは限りません
error
種別 — コンパイルエラー。実行まで到達しません
incompatible types: unexpected return value
内容 — javacが期待していたもの、または見つけられなかったもの

このエラーが出る典型パターン

パターン1

 1  public class Main {
 2      static void show(int n) {
 3          return n             ;
                      ^
 4      }
 5      public static void main(String[] args) {
 6          show(3);
 7      }
 8  }
Main.java:3: error: incompatible types: unexpected return value

voidのメソッドは値を返せません。処理を終えるだけなら return; と値なしで書きます。

直し方: return nSystem.out.println(n) にします。

この問題を解いてみる →

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

パターン2

 1  public class Main {
 2      static void log(String s) {
 3          System.out.println(s);
 4      }
 5      public static void main(String[] args) {
 6          String r = log("hi");
                 ^
 7      }
 8  }
Main.java:6: error: incompatible types: void cannot be converted to String

voidのメソッドの戻り値を受け取ることはできません。呼び出しだけを文として書きます。

直し方: String r = (空) にします。

この問題を解いてみる →

パターン3

 1  public class Main {
 2      static void   sum(int a, int b) {
                  ^
 3          return a + b;
 4      }
 5      public static void main(String[] args) {
 6          System.out.println(sum(1, 2));
 7      }
 8  }
Main.java:3: error: incompatible types: unexpected return value

値を返すメソッドには、返す値の型を宣言します。voidは「返さない」という宣言です。

直し方: voidint にします。

この問題を解いてみる →

パターン4

 1  public class Main {
 2      static void printSum(int a, int b) {
 3          return a + b;
                     ^
 4      }
 5      public static void main(String[] args) {
 6          printSum(1, 2);
 7      }
 8  }
Main.java:3: error: incompatible types: unexpected return value

voidのメソッドはreturnに値を書けません。処理を打ち切りたいだけなら return; と値なしで書きます。

直し方: a + b(空) にします。

この問題を解いてみる →

パターン5

 1  public class Main {
 2      static void log(String s) {
 3          System.out.println(s);
 4      }
 5      public static void main(String[] args) {
 6          String msg = "result: " + log("hi");
                                          ^
 7          System.out.println(msg);
 8      }
 9  }
Main.java:6: error: 'void' type not allowed here

voidのメソッド呼び出しは値を持たないので、式の一部として使うことはできません。

直し方: log("hi")"hi" にします。

この問題を解いてみる →

よくある誤解

return; と return 値; は別物です。voidのメソッドでも、処理を打ち切るための return; は書けます。

まとめ

unexpected return valueは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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