Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试使用自定义JPanel中的方法时出现NullPointerException_Java_Swing_Nullpointerexception_Jpanel - Fatal编程技术网

Java 尝试使用自定义JPanel中的方法时出现NullPointerException

Java 尝试使用自定义JPanel中的方法时出现NullPointerException,java,swing,nullpointerexception,jpanel,Java,Swing,Nullpointerexception,Jpanel,我试图为我不久前创建的游戏制作一个GUI,但在运行时遇到了一个小问题 我想将输出打印到扩展JPanel中的JTextField。但是,当我运行它时,它会出现以下错误: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Classic.print(Classic.java:509) at Classic.play(Classic.java:43) at Karma.actionP

我试图为我不久前创建的游戏制作一个GUI,但在运行时遇到了一个小问题

我想将输出打印到扩展JPanel中的JTextField。但是,当我运行它时,它会出现以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Classic.print(Classic.java:509)
    at Classic.play(Classic.java:43)
    at Karma.actionPerformed(Karma.java:134)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
以下是适用的代码:

(我将跳过Karma.java:134,因为这只是播放按钮。)

Classic.java

import static javax.swing.SwingUtilities.invokeLater; //This is to show where invokeLater comes from
...
public class Classic extends Game {
    private static JFrame gui;
    private static GUIClassic newContentPane;
    ...
    public void play() {
        invokeLater(Classic::startGUI);
        //The next line is "Classic.java:43
        //length, difficulty, and log are all strings that were initialized when the game was instantiated
        print("Selected Options:\nLength: " + length + "\nDifficulty: " + difficulty + "\nOutput Log? " + log + "\n");
        ...
    }
    private static void startGUI() {
        gui = new JFrame("Karma :: Classic Mode");
        gui.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        newContentPane = new GUIClassic();
        newContentPane.setOpaque(true);
        gui.setContentPane(newContentPane);
        gui.pack();
        gui.setVisible(true);
    }
    private static void print(String text) {
        newContentPane.appendOutput(text);
    }
GUIClassic.java(用于内容窗格的类) [编辑:这是上下文的完整类内容。]

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class GUIClassic extends JPanel implements ActionListener {
    private JTextArea output;
    private JTextField input;
    private boolean inputReady;
    private String inputText;
    public GUIClassic() {
        super();
        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
        output = new JTextArea(15, 15);
        output.setEditable(false);
        JScrollPane outputScroll = new JScrollPane(output);
        input = new JTextField("",40);
        add(outputScroll);
        add(Box.createRigidArea(new Dimension(0,5)));
        add(input);
    }
    public void actionPerformed(ActionEvent e) {
        inputText = input.getText();
        inputReady = true;
        input.setText("");
    }
    public boolean isInputReady() {
        return inputReady;
    }
    public String getInput() {
        if (!isInputReady())
            return null;
        inputReady = false;
        return inputText;
    }
    public void appendOutput(String addition) {
        output.append(addition + "\n");
    }
}
有趣的是,GUI确实会在异常发生后弹出并保持不动。它只是没有将输出打印到JTextArea,并且卡住了

如果您需要更多的上下文代码,请让我知道,我会添加它


编辑:一些人指出某些字段可能未初始化。我相应地处理了这些问题。我试图找出导致异常的确切原因,但失败了。它不应该是“newContentPane”或“output”,因为它们都会在程序启动时出现在屏幕上。

您在创建JTextArea之前调用print。invokeLater在打印调用之前运行。最好的修复方法(IMO)是在Runnable.run方法的末尾打印输出语句,该方法首先调用Classic.startGUI,通过invokeLater启动,而不是Classic::startGUI构造函数本身

    invokeLater(Classic::startGUI);
    //The next line is "Classic.java:43
    //length, difficulty, and log are all strings that were initialized when the game was instantiated
    print("Selected Options:\nLength: " + length + "\nDifficulty: " + difficulty + "\nOutput Log? " + log + "\n");

在创建JTextArea之前,您正在调用print。invokeLater在打印调用之前运行。最好的修复方法(IMO)是在Runnable.run方法的末尾打印输出语句,该方法首先调用Classic.startGUI,通过invokeLater启动,而不是Classic::startGUI构造函数本身

    invokeLater(Classic::startGUI);
    //The next line is "Classic.java:43
    //length, difficulty, and log are all strings that were initialized when the game was instantiated
    print("Selected Options:\nLength: " + length + "\nDifficulty: " + difficulty + "\nOutput Log? " + log + "\n");

在创建JTextArea之前,您正在调用print。invokeLater在打印调用之前运行。最好的修复方法(IMO)是在Runnable.run方法的末尾打印输出语句,该方法首先调用Classic.startGUI,通过invokeLater启动,而不是Classic::startGUI构造函数本身

    invokeLater(Classic::startGUI);
    //The next line is "Classic.java:43
    //length, difficulty, and log are all strings that were initialized when the game was instantiated
    print("Selected Options:\nLength: " + length + "\nDifficulty: " + difficulty + "\nOutput Log? " + log + "\n");

在创建JTextArea之前,您正在调用print。invokeLater在打印调用之前运行。最好的修复方法(IMO)是在Runnable.run方法的末尾打印输出语句,该方法首先调用Classic.startGUI,通过invokeLater启动,而不是Classic::startGUI构造函数本身

    invokeLater(Classic::startGUI);
    //The next line is "Classic.java:43
    //length, difficulty, and log are all strings that were initialized when the game was instantiated
    print("Selected Options:\nLength: " + length + "\nDifficulty: " + difficulty + "\nOutput Log? " + log + "\n");

检查此项,以下是您的错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Classic.print(Classic.java:509)
这是您的
Classic#打印

private static void print(String text) {
    newContentPane.appendOutput(text);
}
在这里,唯一会引发
NullPointerException
是当
newContentPane
等于
null
时出现的异常

是的,您可能有一些初始化
newContentPane
的代码,但在调用
Classic\print
之前,这些代码不会及时发生


那么,为什么它没有及时发生呢?就像每个人都在试图告诉你的那样,这与使用
invokeLater

有关检查一下,这里是你的错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Classic.print(Classic.java:509)
这是您的
Classic#打印

private static void print(String text) {
    newContentPane.appendOutput(text);
}
在这里,唯一会引发
NullPointerException
是当
newContentPane
等于
null
时出现的异常

是的,您可能有一些初始化
newContentPane
的代码,但在调用
Classic\print
之前,这些代码不会及时发生


那么,为什么它没有及时发生呢?就像每个人都在试图告诉你的那样,这与使用
invokeLater

有关检查一下,这里是你的错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Classic.print(Classic.java:509)
这是您的
Classic#打印

private static void print(String text) {
    newContentPane.appendOutput(text);
}
在这里,唯一会引发
NullPointerException
是当
newContentPane
等于
null
时出现的异常

是的,您可能有一些初始化
newContentPane
的代码,但在调用
Classic\print
之前,这些代码不会及时发生


那么,为什么它没有及时发生呢?就像每个人都在试图告诉你的那样,这与使用
invokeLater

有关检查一下,这里是你的错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Classic.print(Classic.java:509)
这是您的
Classic#打印

private static void print(String text) {
    newContentPane.appendOutput(text);
}
在这里,唯一会引发
NullPointerException
是当
newContentPane
等于
null
时出现的异常

是的,您可能有一些初始化
newContentPane
的代码,但在调用
Classic\print
之前,这些代码不会及时发生


那么,为什么它没有及时发生呢?就像每个人都试图告诉你的那样,这与使用
invokeLater

有关。看起来
newContentPane
null
,你永远不会初始化它。Tunaki可能是重复的,我用StartGUI方法初始化了它。我还尝试将初始化移到类的最开始,出现了相同的错误。哪一行是Classic.java的第509行?这就是stacktrace指向的地方,也是您应该查看的地方。它是print方法内部的指令行。我们认为这是由于在play()的第一个print调用之前的行中调用了invokeLater。现在的问题是如何实现可运行。看起来
newContentPane
null
,您从未初始化它。Tunaki可能重复,我在StartGUI方法中初始化了它。我还尝试将初始化移到类的最开始,出现了相同的错误。哪一行是Classic.java的第509行?这就是stacktrace指向的地方,也是您应该查看的地方。它是print方法内部的指令行。我们认为这是由于在play()的第一个print调用之前的行中调用了invokeLater。现在的问题是如何实现可运行。看起来
newContentPane
null
,您从未初始化它。Tunaki可能重复,我在StartGUI方法中初始化了它。我还尝试将初始化移到版本