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 n を System.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は「返さない」という宣言です。
直し方: void を int にします。
パターン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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。