【问题标题】:Why would a program compile for me, but not for another person?为什么一个程序会为我编译,而不是为另一个人编译?
【发布时间】:2015-06-07 03:33:03
【问题描述】:

我的代码如下。它对我来说编译得很好,但是我的教授说他遇到了一个错误,因为我的类中没有一些变量声明为 final。 Eclipse 在我的机器上似乎没有这个问题,所以我不知道如何修复我看不到的错误。

我知道某些变量必须是 final 才能在嵌套类中工作,但我创建的那些似乎工作得很好,不管是否是 final。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.Random;

public class JColorFrame extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JColorFrame frame = new JColorFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public JColorFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 522, 339);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.NORTH);

        JPanel panel_1 = new JPanel();
        contentPane.add(panel_1, BorderLayout.WEST);

        JPanel panel_2 = new JPanel();
        contentPane.add(panel_2, BorderLayout.EAST);

        JPanel panel_3 = new JPanel();
        contentPane.add(panel_3, BorderLayout.SOUTH);

        Color[] color = new Color[8];
        color[0] = Color.black;
        color[1] = Color.white;
        color[2] = Color.red;
        color[3] = Color.blue;
        color[4] = Color.green;
        color[5] = Color.yellow;
        color[6] = Color.magenta;
        color[7] = Color.orange;

        JButton btnChangeColor = new JButton("Change Color");
        btnChangeColor.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Random random = new Random();
                int random_1 = random.nextInt(4);
                switch (random_1) {
                    case 0:
                        int random_2 = random.nextInt(8);
                        panel.setBackground(color[random_2]);
                        break;
                    case 1:
                        random_2 = random.nextInt(8);
                        panel_1.setBackground(color[random_2]);
                        break;
                    case 2:
                        random_2 = random.nextInt(8);
                        panel_2.setBackground(color[random_2]);
                        break;
                    case 3:
                        random_2 = random.nextInt(8);
                        panel_3.setBackground(color[random_2]);
                        break;

                }

            }
        });

        contentPane.add(btnChangeColor, BorderLayout.CENTER);
    }
}

【问题讨论】:

  • 你正在使用 Java 7 > 而你的教授正在使用 Java 6
  • @MadProgrammer:更像是他们使用的是 Java 8,而他们的教授使用的是 Java 7 或更低版本。
  • @Makoto 可能,我跳过了 Java 7:P

标签: java compiler-errors final


【解决方案1】:

内部类,例如您的ActionListener,无法从包含它的范围访问非final 变量。在Java 8以下的版本中,编译器遇到这种情况会自动抛出错误。

在 Java 8 中,编译器将简单地生成变量 final,前提是它们没有在文件中的任何位置更改,因为您的变量不在这里。

有关详细信息,请参阅this post

可能您的教授使用的是 Java 7 或更早版本,因此您的代码无法编译。只需将您在内部类中使用的任何局部变量设置为 final

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多