为什么一个程序会为我编译,而不是为另一个人编译?
Why would a program compile for me, but not for another person?
我的代码如下。它对我来说编译得很好,但是我的教授说他遇到了一个错误,因为我在 class 声明的 final 中没有几个变量。 Eclipse 在我的机器上似乎没有这个问题,所以我不知道如何修复我看不到的错误。
我知道有些变量需要是 final 才能在嵌套 classes 中工作,但我创建的变量似乎工作得很好,无论是否为 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);
}
}
内部 classes,例如您的 ActionListener
,无法从包含它的范围访问非 final
变量。 Java 8以下的版本,遇到这种情况,编译器会自动抛出错误。
在 Java 8 中,如果变量在文件中的任何地方都没有改变,编译器将简单地生成变量 final
,因为你的不在这里。
有关详细信息,请参阅 this post。
可能您的教授使用的是 Java 7 或更早版本,因此您的代码无法编译。只需在内部 class final
.
中使用任何局部变量
我的代码如下。它对我来说编译得很好,但是我的教授说他遇到了一个错误,因为我在 class 声明的 final 中没有几个变量。 Eclipse 在我的机器上似乎没有这个问题,所以我不知道如何修复我看不到的错误。
我知道有些变量需要是 final 才能在嵌套 classes 中工作,但我创建的变量似乎工作得很好,无论是否为 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);
}
}
内部 classes,例如您的 ActionListener
,无法从包含它的范围访问非 final
变量。 Java 8以下的版本,遇到这种情况,编译器会自动抛出错误。
在 Java 8 中,如果变量在文件中的任何地方都没有改变,编译器将简单地生成变量 final
,因为你的不在这里。
有关详细信息,请参阅 this post。
可能您的教授使用的是 Java 7 或更早版本,因此您的代码无法编译。只需在内部 class final
.