コンストラクタとメソッドの見分け方
戻り値型を書くとただのメソッドになります。既定コンストラクタが消える条件も扱います。
エラーメッセージの読み方
Main.java:5: error: constructor Main in class Main cannot be applied to given types;
Main.java- ファイル名
5- 行番号 — javacが異常に気づいた位置。原因の行とは限りません
error- 種別 — コンパイルエラー。実行まで到達しません
constructor Main in class Main cannot be applied to given types;- 内容 — javacが期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 public class Main { 2 int value; 3 void Main(int v) { this.value = v; } ^ 4 public static void main(String[] args) { 5 System.out.println(new Main(3).value); 6 } 7 }
Main.java:5: error: constructor Main in class Main cannot be applied to given types;
required: no arguments
戻り値型を書くとコンストラクタではなく普通のメソッドになります。引数なしの既定コンストラクタだけが残ります。
直し方: void を (空) にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 int value; 3 Init (int v) { this.value = v; } ^ 4 public static void main(String[] args) { 5 System.out.println(new Main(3).value); 6 } 7 }
Main.java:3: error: invalid method declaration; return type required
コンストラクタ名はクラス名と完全に一致させます。違う名前は戻り値型のないメソッドと判断されます。
直し方: Init を Main にします。
パターン3
1 public class Main { 2 int value; 3 Main(int v) { this.value = v; } 4 public static void main(String[] args) { 5 Main m = new Main( ); ^ 6 System.out.println(m.value); 7 } 8 }
Main.java:5: error: constructor Main in class Main cannot be applied to given types;
required: int found: no arguments
引数付きコンストラクタを定義すると、既定の引数なしコンストラクタは自動生成されなくなります。
直し方: (空) を 3 にします。
パターン4
1 public class Main { 2 int value; 3 Main(int v) { 4 this.value = v; 5 return value; ^ 6 } 7 public static void main(String[] args) { 8 System.out.println(new Main(3).value); 9 } 10 }
Main.java:5: error: incompatible types: unexpected return value
コンストラクタは戻り値を持てません。処理を途中で打ち切りたいだけなら値のないreturn;を使います。
直し方: return value; を return; にします。
パターン5
1 public class Main { 2 int a; 3 Main() { System.out.println("default"); this(5); } ^ 4 Main(int a) { this.a = a; } 5 public static void main(String[] args) { new Main(); } 6 }
Main.java:3: error: call to this must be first statement in constructor
this(...)で他のコンストラクタを呼ぶのは、必ずコンストラクタの先頭でなければなりません。
直し方: this(5); を (空) にします。
よくある誤解
voidを付けてもエラーになりません。ただのメソッドになるので、「コンストラクタが呼ばれない」という症状で気づきます。
実務での勘所
コンパイラが既定のコンストラクタ(引数なし・処理なし)を自動生成してくれるのは、そのクラスに一つもコンストラクタを書いていない場合だけです。1つでも自分でコンストラクタを書くと、既定のコンストラクタは生成されなくなります。また、戻り値の型を書き忘れる以外に、クラス名と大文字小文字まで完全に一致していない場合も、コンストラクタではなくただのメソッドとして扱われます。名前の一致は文字列としての完全一致が条件です。