コンストラクタとメソッドの見分け方
戻り値型を書くとただのメソッドになります。既定コンストラクタが消える条件も扱います。
エラーメッセージの読み方
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 にします。
よくある誤解
voidを付けてもエラーになりません。ただのメソッドになるので、「コンストラクタが呼ばれない」という症状で気づきます。
まとめ
コンストラクタとメソッドの見分け方は上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。