为何向Ouvrier类构造函数添加属性后主框架报错?
嘿,我来帮你揪出报错根源!
你的代码之所以报错,核心问题出在构造函数的匹配上,具体有两个关键问题:
- 自定义构造函数覆盖了默认无参构造
Java里有个默认规则:如果一个类没有自己写任何构造函数,编译器会自动给你生成一个无参的构造函数。但你现在显式定义了带int numOuvrier参数的构造函数:
public Ouvrier(int numOuvrier) { initComponents(); this.numOuvrier=numOuvrier; }
这时候编译器就不会再自动生成无参构造了——相当于你用自定义的构造“替换”了默认的无参版本。
- 启动代码里调用了不存在的无参构造
你看这段启动窗口的代码:
java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Ouvrier().setVisible(true); // 这里问题来了! } });
你用new Ouvrier()尝试创建窗口实例,但这个无参构造已经不存在了,编译器找不到对应的构造方法,自然就报错了。
两种快速修复方案
你可以任选一种解决:
- 方案一:手动加个无参构造
如果需要保留无参创建实例的能力,就自己写一个无参构造,给numOuvrier设个默认值就行:
public Ouvrier() { initComponents(); this.numOuvrier = 0; // 这里可以换成你需要的默认数值 }
- 方案二:启动时传入参数
如果不需要无参构造,就在创建实例的时候传入对应的int参数,比如:
java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Ouvrier(1).setVisible(true); // 传入具体的numOuvrier数值,比如1 } });
另外还要提个小细节:你那段EventQueue.invokeLater的代码位置不对,不能直接放在类的成员位置,得放在方法里(比如main方法),不然也会编译报错。调整后的完整代码大概是这样:
public class Ouvrier extends javax.swing.JFrame { private final int numOuvrier; public Ouvrier(int numOuvrier) { initComponents(); this.numOuvrier=numOuvrier; } // 加个main方法来启动窗口 public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Ouvrier(1).setVisible(true); } }); } }
内容的提问来源于stack exchange,提问作者zouhair zouita
相关产品推荐
相关产品推荐

