Ghost Exceptions:空行上的Java异常

时间:2014-10-29 21:14:33

标签: java swing exception

好吧,我正在尝试为计算器创建一个界面。此时,我有一个按钮,一个问候标签和一个标签,它将成为计算器的主线。当我运行代码时,窗口打开并显示问候语,但按钮无处可见。终端显示:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 

Cannot use this in a static context

    at Components.Interface.buttons(Interface.java:45)
    at Components.Interface.main(Interface.java:60)

问题是,即使第45行和第60行没有代码,java仍会为这些行抛出异常。它为什么这样做?代码如下:

package Components;

import java.awt.event.*;
import java.awt.*;

import javax.swing.*;

public class Interface {


    public static void main(String[] args) {
        // TODO Auto-generated method stub

        JFrame frame;
        JPanel text = new JPanel();
        JPanel controlPanel = new JPanel();
        JLabel digits = new JLabel("");

        frame = new JFrame("Calculator");
        frame.setLayout(new FlowLayout());
        frame.setPreferredSize(new Dimension(300, 400));
        frame.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent windowEvent) {
                System.exit(0);
            }
        });

        frame.add(text);
        frame.add(controlPanel);
        frame.setVisible(true);
        frame.pack();
//about where line 45 is

        digits.setBorder(BorderFactory.createLineBorder(Color.black));
        digits.setSize(new Dimension(30, 20));

        text.add(digits);

        JLabel greet = new JLabel("Welcome to Calculator!");
        greet.setSize(30, 20);
        greet.setVerticalAlignment(SwingConstants.TOP);
        greet.setBorder(BorderFactory.createLineBorder(Color.black));

        text.add(greet);
//about where line 60 is
        JButton one = new JButton("1");

        one.setSize(100, 30);

        one.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                digits.setText("1");
            }
        });
        controlPanel.add(one);
    }
}

1 个答案:

答案 0 :(得分:3)

你现在最大的错误就是你正试图运行不可编辑的代码 - 永远不要这样做!而是找出编译器告诉你的问题,而不是JVM,然后尝试修复它们。只有在编译没有错误的情况下才尝试运行代码。

然后,编译器会警告您,您正在尝试在匿名内部类中使用非最终本地变量数字,这是不允许的。解决方案是将数字声明为最终变量。

final JLabel digits = new JLabel ("");

你可能会问为什么存在这个奇怪的要求,内部类是真正的类,甚至是匿名的内部类(比如你的ActionListener),当Java创建一个时,它会生成内部类使用的局部变量的副本,并传递这些副本进入内部阶级。如果变量不是最终变量,则副本可能与原始变量不同步。