java - 使用 For 循环初始化 JTextFields 和 JLabels 并将其添加到 JPanel 使用数组会导致错误

标签 java arrays swing nullpointerexception

我正在尝试制作一个程序,该程序接受用户输入的类(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,或者 pnull。但 nlabel[i] 在上一个循环中被初始化为非空值,这表明 p 是罪魁祸首。解决此问题的一种方法是更改​​:

static JPanel p;

致:

JPanel p = new JPanel(); // with default FlowLayout

提示

  1. 不要将 GUI 组件声明为静态。使用 static 修饰符很少是一个好主意,而且我从未见过将它用于组件的情况 - 从来没有。
  2. 您需要弄清楚如何理解和解决堆栈跟踪中的异常。作为一名程序员,我们在我们的代码或我们要维护的代码中看到了许多这样的问题。重申一下我上面在评论中写的内容:请参阅 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?
  3. 不要将命令行输入与 GUI 混合使用。在这种情况下,一种方法是使用 JOptionPane.showInputDialog(..); 查询学生人数。

关于java - 使用 For 循环初始化 JTextFields 和 JLabels 并将其添加到 JPanel 使用数组会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39443440/

相关文章:

java - 将现有的多个对象添加到 JFrame

java - 当用户单击窗口的关闭按钮时隐藏框架而不是关闭

java - 对于 String 类型,方法 add(String) 未定义

java - 使用 jQuery 选择组合框上的项目时,在另一个 jsp 页面中加载特定的 jsp 页面

javascript - 如何根据 null 键值操作 JavaScript 数组对象数据

c - 二维字符数组中的 C 指针问题

java - 数组复制困惑

java - 选择/突出显示属于 JOptionPane 的 JTextArea 中的文本

java - 如何将 webapp 打包为可部署的 war ?

java - 如何获取 JTextField 的真实 x 和 y 坐标