Java报错‘PriorityTable(String,String)构造器未定义’但已定义的问题
问题原因分析与解决方案
哥们儿,你踩了Java构造方法的一个经典语法坑——错误地给构造方法添加了void返回值类型,这直接导致你定义的两个“构造器”其实都是普通方法,编译器根本不把它们当成构造器看待,所以才会提示找不到PriorityTable(String,String)构造器。
核心问题拆解
- 构造方法的语法规则
Java里的构造方法必须满足两个硬性条件:
- 方法名和类名完全一致(大小写也要严格匹配)
- 绝对不能有返回值类型,包括
void
你写的代码里:
public void PriorityTable(){...} public void PriorityTable(String letters, String level){...}
这两个都是带void的普通方法,不是构造器。此时编译器会认为你的类没有显式定义任何构造器,同时因为你手动写了普通方法,Java不会自动生成默认的隐式无参构造器,所以不管你怎么调用,都找不到匹配的构造器。
- 构造器内部调用的错误方式
就算你修复了返回值的问题,直接写PriorityTable();来调用无参构造也是错的——这会被当成普通方法调用,而不是构造器调用。正确的做法是用this();,而且这条语句必须是构造方法的第一条语句。
修正后的代码示例
public class PriorityTable { // 无参构造器:没有返回值类型 public PriorityTable() { // 你的初始化逻辑 ... } // 带参数的构造器:同样没有返回值类型 public PriorityTable(String letters, String level) { // 调用无参构造器,必须放在第一行 this(); // 处理参数相关的初始化逻辑 ... } } // 现在创建对象就可以正常编译了 PriorityTable pTable = new PriorityTable(s, startExp);
为什么注释掉无参调用还是报错?
因为本质问题没解决——带参数的那个方法依然是普通方法,不是构造器,编译器还是找不到你要调用的PriorityTable(String,String)构造器,所以错误会持续存在。
内容的提问来源于stack exchange,提问作者Matt Waits
相关产品推荐
相关产品推荐

