取消时 JOptionPane 抛出错误
JOptionPane throwing error when cancelled
目前遇到一个问题,我弹出消息对话框提示用户输入字符串。我检查了名称是否为空,如果他们点击 "ok" 按钮,它可以正常工作,但是如果用户点击取消按钮(无论他们是否在文本框中输入任何内容),那么我会收到以下错误:
java.lang.NullPointerException
at cc.nisc.mapping.mappingadvsearch.ResultsPopupMenu.doActionPerformed(ResultsPopupMenu.java:98)
at cc.nisc.gui.action.NiscAction.actionPerformed(NiscAction.java:225)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
相关代码为:
public final ResultsMenuAction createLayerAction = new ResultsMenuAction("uiCreateLayer") {
@Override
protected void doActionPerformed(ActionEvent e) {
try {
String queryName = JOptionPane.showInputDialog(WinMgr.getInstance().getSelectedNavigator(),
"Enter a name for your exported query layer",
"Enter Query Name",
JOptionPane.QUESTION_MESSAGE);
if (queryName.isEmpty()) {
JOptionPane.showMessageDialog(WinMgr.getInstance().getSelectedNavigator(),
"Please enter a name for your query",
"Empty name",
JOptionPane.WARNING_MESSAGE);
return;
}
....
....
如何检查取消按钮是否已被单击以便 return 而不是引发错误?
来自 JOptionPane.showInternalInputDialog()
上的 JavaDoc,由您正在使用的方法调用:
Returns:
user's input, or null meaning the user canceled the input
因此null
表示输入被取消。
要检查 null 或空输入,您首先检查 null,然后检查空,因为对 null 调用 isEmpty()
将导致 NPE。
请记住,||
是短路 或 运算符,即它将从左到右评估表达式,并在条件变为真时停止。因此 if( queryName == null || queryName.isEmpty() )
不会抛出 NPE,因为如果 queryName
为空,则条件为真,并且永远不会调用 isEmpty()
。
相比之下,单个管道 |
不是短路运算符,即无论 left 是否已经为真,都会计算两个表达式。因此 queryName == null | queryName.isEmpty()
可能仍会抛出 NPE。
而不是 if (queryName.isEmpty()) {
,尝试将该行更改为:
if (queryName == null || queryName.isEmpty()) {
您最有可能收到错误的原因是 queryName
很可能为空。所以尝试在空对象上调用 isEmpty()
会给你一个空指针异常。
目前遇到一个问题,我弹出消息对话框提示用户输入字符串。我检查了名称是否为空,如果他们点击 "ok" 按钮,它可以正常工作,但是如果用户点击取消按钮(无论他们是否在文本框中输入任何内容),那么我会收到以下错误:
java.lang.NullPointerException
at cc.nisc.mapping.mappingadvsearch.ResultsPopupMenu.doActionPerformed(ResultsPopupMenu.java:98)
at cc.nisc.gui.action.NiscAction.actionPerformed(NiscAction.java:225)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
相关代码为:
public final ResultsMenuAction createLayerAction = new ResultsMenuAction("uiCreateLayer") {
@Override
protected void doActionPerformed(ActionEvent e) {
try {
String queryName = JOptionPane.showInputDialog(WinMgr.getInstance().getSelectedNavigator(),
"Enter a name for your exported query layer",
"Enter Query Name",
JOptionPane.QUESTION_MESSAGE);
if (queryName.isEmpty()) {
JOptionPane.showMessageDialog(WinMgr.getInstance().getSelectedNavigator(),
"Please enter a name for your query",
"Empty name",
JOptionPane.WARNING_MESSAGE);
return;
}
....
....
如何检查取消按钮是否已被单击以便 return 而不是引发错误?
来自 JOptionPane.showInternalInputDialog()
上的 JavaDoc,由您正在使用的方法调用:
Returns: user's input, or null meaning the user canceled the input
因此null
表示输入被取消。
要检查 null 或空输入,您首先检查 null,然后检查空,因为对 null 调用 isEmpty()
将导致 NPE。
请记住,||
是短路 或 运算符,即它将从左到右评估表达式,并在条件变为真时停止。因此 if( queryName == null || queryName.isEmpty() )
不会抛出 NPE,因为如果 queryName
为空,则条件为真,并且永远不会调用 isEmpty()
。
相比之下,单个管道 |
不是短路运算符,即无论 left 是否已经为真,都会计算两个表达式。因此 queryName == null | queryName.isEmpty()
可能仍会抛出 NPE。
而不是 if (queryName.isEmpty()) {
,尝试将该行更改为:
if (queryName == null || queryName.isEmpty()) {
您最有可能收到错误的原因是 queryName
很可能为空。所以尝试在空对象上调用 isEmpty()
会给你一个空指针异常。