我正在尝试制作一个程序,该程序接受用户输入的类(class)中有多少学生以及他们的姓名/成绩,并计算平均成绩和字母成绩。我正在尝试更好地使用 For 循环 和数组,这就是我选择做的事情。唯一的问题是调用 init() 方法来创建窗口时。该类正在扩展 JFrame
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class GradesGUI_2 extends JFrame {
static Scanner s = new Scanner(System.in);
static int num;
public static void main(String[] args) {
System.out.println("How many students are in your class?");
num = s.nextInt();
GradesGUI_2 window = new GradesGUI_2("Title");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//-------------------------------------------------
static JPanel p;
JTextField[] name = new JTextField[num], grade = new JTextField[num];
JLabel[] nlabel = new JLabel[num], glabel = new JLabel[num];
int height = 50;
//-------------------------------------------------
GradesGUI_2(String title) {
super(title);
this.init();
this.setVisible(true);
this.setLocationRelativeTo(null);
}
//-------------------------------------------------
void init() {
//Create JLabel/JTextField
for(int i = 0; i < num; i++) {
nlabel[i] = new JLabel("Name " + i);
glabel[i] = new JLabel("Grade " + i);
name[i] = new JTextField(10);
grade[i] = new JTextField(1);
height += 25;
}
for(int i = 0; i < num; i++) {
p.add(nlabel[i]);
p.add(glabel[i]);
p.add(name[i]);
p.add(grade[i]);
}
this.setSize(350, height);
this.add(p);
}
}
控制台显示的内容:
How many students are in your class?
7
Exception in thread "main" java.lang.NullPointerException
at GradesGUI_2.init(GradesGUI_2.java:59)
at GradesGUI_2.<init>(GradesGUI_2.java:40)
at GradesGUI_2.main(GradesGUI_2.java:20)
将组件添加到面板时会发生错误。请回答。谢谢!
最佳答案
异常堆栈跟踪指向此行:
p.add(nlabel[i]);
因此,nlabel[i]
为 null
,或者 p
为 null
。但 nlabel[i]
在上一个循环中被初始化为非空值,这表明 p
是罪魁祸首。解决此问题的一种方法是更改:
static JPanel p;
致:
JPanel p = new JPanel(); // with default FlowLayout
提示
- 不要将 GUI 组件声明为
静态
。使用static
修饰符很少是一个好主意,而且我从未见过将它用于组件的情况 - 从来没有。 - 您需要弄清楚如何理解和解决堆栈跟踪中的异常。作为一名程序员,我们在我们的代码或我们要维护的代码中看到了许多这样的问题。重申一下我上面在评论中写的内容:请参阅 What is a stack trace, and how can I use it to debug my application errors? & What is a Null Pointer Exception, and how do I fix it?
- 不要将命令行输入与 GUI 混合使用。在这种情况下,一种方法是使用
JOptionPane.showInputDialog(..);
查询学生人数。
关于java - 使用 For 循环初始化 JTextFields 和 JLabels 并将其添加到 JPanel 使用数组会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39443440/