在 Java 中无法使用"extend"命令,否则程序崩溃



我的课程有一点问题。我的程序工作正常,至少如果我只创建 Gui 类的一个实例,但是如果我在另一个类上使用"extend"命令来扩展 Gui 类,创建的 Gui 会给我一些错误消息。我有两个类,Gui 类和"哈希"类。如果我不在哈希类上使用"extend Gui",一切都很好,但是如果我这样做,我会收到这些错误:

java.lang.StackOverflowError
at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
at sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:222)
at java.awt.Window.init(Window.java:505)
at java.awt.Window.<init>(Window.java:537)
at java.awt.Frame.<init>(Frame.java:420)
at java.awt.Frame.<init>(Frame.java:385)
at javax.swing.JFrame.<init>(JFrame.java:189)
at Gui.<init>(Gui.java:33)
at Hashings.<init>(Hashings.java:1)
at Gui.<init>(Gui.java:29)
at Hashings.<init>(Hashings.java:1)

下面是哈希类:

public class Hashings extends Gui{
}  

这里的Gui类(有点混乱(

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Gui extends JFrame
{ 
public static void main (String[] args) {
}     
BorderLayout b1 = new BorderLayout();  
public int anzahl;
public int ascii;
int e;
JTextField name = new JTextField(8);
JButton confirm2 = new JButton("Einfügen");
JTextField name2 = new JTextField(5);
JButton confirm3 = new JButton("Suchen");
JPanel b = new JPanel();
JPanel c = new JPanel();
JPanel a = new JPanel();
Label[] lab = new Label[10];
Hashings h = new Hashings();
public Gui() { 
super();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) { dispose(); }
});
int frameWidth = 1280; 
int frameHeight = 7;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setTitle("Gui");
setResizable(false);

b.add(name); 
b.add(confirm2);
b.add(HashMethod);
c.add(name2);
c.add(confirm3);
this.add(b,BorderLayout.NORTH);
this.add(a,BorderLayout.CENTER);
this.add(c,BorderLayout.SOUTH); 

for(int i=0;i<10;i++){
lab[i]=new Label("leer");
}

for(int i=0;i<10;i++){
a.add(lab[i]);
}
setVisible(true);  
} 
} 

在类GuiHashings h = new Hashings();创建了一个实例。

Gui的第一个实例化调用Hashings的构造函数,而构造函数本身调用Gui的默认构造函数。现在有循环 instatntiation 循环,直到堆栈溢出并且您得到异常。

只需将一些输出放在Gui的构造函数中System.err即可确认。

在您的堆栈跟踪中,有一个有趣的段。

at Gui.<init>(Gui.java:33)
at Hashings.<init>(Hashings.java:1)
at Gui.<init>(Gui.java:29)
at Hashings.<init>(Hashings.java:1)

你所做的是创建一个无限循环。 初始哈希对象的创建调用 Gui init 方法。 在 Gui 中,您有一个正在构造的哈希字段。 因此,每次创建哈希时,它都会输入 Gui,从而创建一个新的哈希,从而输入一个新的 Gui,从而创建一个新的哈希...... 这会导致堆栈溢出,因为最终您将耗尽内存。

Label[] lab = new Label[10];
Hashings h = new Hashings();
public Gui() {

要解决此问题,您必须中断命令循环,可能通过删除哈希字段。

编辑: 为了解决这个问题并访问 Gui 的整数,我会将哈希的构造函数移动到 Gui 构造函数中。

Label[] lab = new Label[10];
public Gui() {
Hashings h = new Hashings(this);

然后

public class Hashings {
private Gui gui;
public Hashings(Gui g)
{
gui = g;
} 
}

由于您的 Gui int 字段是公共的,您可以直接使用这些字段,但我更喜欢添加 getter 和 setter 方法。

最新更新