Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 关于构造函数的奇怪NullPointerException_Java_Swing_Constructor_Nullpointerexception - Fatal编程技术网

Java 关于构造函数的奇怪NullPointerException

Java 关于构造函数的奇怪NullPointerException,java,swing,constructor,nullpointerexception,Java,Swing,Constructor,Nullpointerexception,我正在使用聊天客户端/服务器。在客户端中,我有一个名为ClientGui的类和一个名为InputPane的子类,它扩展了JPanelClientGui处理GUI相关客户端的主要部分,但InputPane仅处理来自用户的输入 在ClientGui类的InputPane对象中设置字体时,我不断收到一个奇怪的NullPointerException。以下是我的一些代码: public ClientGui() { // configure JFrame this.serverOutpu

我正在使用聊天客户端/服务器。在客户端中,我有一个名为
ClientGui
的类和一个名为
InputPane
的子类,它扩展了
JPanel
ClientGui
处理GUI相关客户端的主要部分,但
InputPane
仅处理来自用户的输入

ClientGui
类的
InputPane
对象中设置字体时,我不断收到一个奇怪的
NullPointerException
。以下是我的一些代码:

public ClientGui() {
    // configure JFrame

    this.serverOutput = new JTextPane();
    this.input = new InputPane();

    // configure JScrollPane

    // configure other objects

    // various set up methods

    frame.add(scrollPane, BorderLayout.CENTER);
    frame.add(input, BorderLayout.PAGE_END);
}
如您所见,
输入
对象正在初始化。这是它的构造器:

public InputPane() {
        this.inputField = new JTextField();
        this.send = new JButton("Send");

        // set size

        this.setFont(getFont());

        // various methods

        // add components
    }
当我尝试设置字体时,它会抛出一个
NullPointerException
。通过各种
println()
调用,我发现
inputField
send
为空。我尝试将
println()
方法放入构造函数中,但没有调用(和/或打印)任何方法

我对此感到非常困惑。如果有人能解释一下,那会很有帮助。多谢各位

编辑:以下是堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
at net.dean.tcp.client.gui.ClientGui$InputPane.setFont(ClientGui.java:518)
at javax.swing.LookAndFeel.installColorsAndFont(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installDefaults(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installUI(Unknown Source)
at javax.swing.JComponent.setUI(Unknown Source)
at javax.swing.JPanel.setUI(Unknown Source)
at javax.swing.JPanel.updateUI(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at net.dean.tcp.client.gui.ClientGui$InputPane.<init>(ClientGui.java:496)
at net.dean.tcp.client.gui.ClientGui.<init>(ClientGui.java:138)
at net.dean.tcp.client.gui.ClientGui.main(ClientGui.java:44)

当您使用
setFont
设置字体时,从
getFont
方法获取字体并进行设置。更有可能的是,此
getFont()
返回NULL,这可能就是原因。另外,在我看来,
inputField
send
对象在
inputPane
对象中都不能为NULL,除非您显式地将它们设置为NULL

当您使用
setFont
设置字体,并从
getFont
方法获取字体并进行设置时。更有可能的是,此
getFont()
返回NULL,这可能就是原因。另外,在我看来,
inputField
send
对象在
inputPane
对象中都不能为NULL,除非您显式地将它们设置为NULL

问题在于Swing框架调用
setFont
作为
JPanel
构造函数的一部分。由于这在构造函数主体之前执行,
InputPane.setFont
send
inputField
成员变量初始化之前被调用。我认为这里唯一干净的解决方案是在
InputPane.setFont
内执行显式空检查:

public void setFont(Font f) {
    super.setFont(f);
    if (inputField != null) {
        inputField.setFont(f);
    }
    if (send != null) {
        send.setFont(f);
    }

    Dimension size = getSizeFromFont(); 
    // Dimension based on getFont()'s height

    if (send != null) {
        send.setPreferredSize(size);
    }
    if (inputField != null) {
        inputField.setPreferredSize(size);
    }
}
(您可能可以重新组织调用以减少空检查的数量。)


顺便说一句,这是一个很好的例子。但Swing就是这样,抱怨也无益,所以我就到此为止。:)

问题在于Swing框架调用
setFont
作为
JPanel
构造函数的一部分。由于这在构造函数主体之前执行,
InputPane.setFont
send
inputField
成员变量初始化之前被调用。我认为这里唯一干净的解决方案是在
InputPane.setFont
内执行显式空检查:

public void setFont(Font f) {
    super.setFont(f);
    if (inputField != null) {
        inputField.setFont(f);
    }
    if (send != null) {
        send.setFont(f);
    }

    Dimension size = getSizeFromFont(); 
    // Dimension based on getFont()'s height

    if (send != null) {
        send.setPreferredSize(size);
    }
    if (inputField != null) {
        inputField.setPreferredSize(size);
    }
}
(您可能可以重新组织调用以减少空检查的数量。)



顺便说一句,这是一个很好的例子。但Swing就是这样,抱怨也无益,所以我就到此为止。:)

用户界面可能尚未安装或初始化。奇怪的问题是,为什么要将字体设置回相同的组件?是否可以加入stacktrace?完整的代码在这里也会有所帮助。为什么这个被标记为“嵌套类”?我没有看到任何嵌套。@TedHopp这被标记为嵌套类,因为InputPane嵌套在ClientGui.ClientGui.java:518中,这就是发生异常的地方。能否发布
ClientGui$InputPane.setFont
方法?用户界面可能尚未安装或初始化。奇怪的问题是,为什么要将字体设置回相同的组件?是否可以加入stacktrace?完整的代码在这里也会有所帮助。为什么这个被标记为“嵌套类”?我没有看到任何嵌套。@TedHopp这被标记为嵌套类,因为InputPane嵌套在ClientGui.ClientGui.java:518中,这就是发生异常的地方。你能发布
ClientGui$InputPane.setFont
方法吗?正如我在问题评论中所说,“它抛出NullPointerException的那一行是它设置inputField字体的地方。字体变量不是null,但inputField是。”@whowantsakookie不确定异常详细信息,为了更好地帮助尽快发布SSCCE,因为您将属性与未初始化的字段或它们是???混合,@mKorbel我尝试使用SSCCE。正如我在问题注释中所说,“它抛出NullPointerException的行是它设置inputField字体的位置。字体变量不是null,但inputField是。”@whowantsakookie不确定从异常详细信息,为了获得更好的帮助,请尽快发布SSCCE,因为您将属性与未初始化的字段混合在一起,或者它们是???,@mKorbel我尝试使用SSCCE。为什么我没有想到这一点?脸掌*谢谢:)为什么我没想到?脸掌*谢谢:)