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。为什么我没有想到这一点?脸掌*谢谢:)为什么我没想到?脸掌*谢谢:)