取消时JOptionPane抛出错误

时间:2015-06-23 14:11:27

标签: java nullpointerexception joptionpane

目前我遇到的问题是我弹出一个消息对话框,提示用户输入一个字符串。我检查了名称为空的,如果他们点击“确定”按钮就可以正常工作但是如果用户点击取消按钮(无论他们是否在文本框中输入任何内容),那么我会收到以下错误:

java.lang.NullPointerException
at cc.nisc.mapping.mappingadvsearch.ResultsPopupMenu$1.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;
            }
            ....
            ....

如何查看是否已单击取消按钮以返回而不是引发错误?

2 个答案:

答案 0 :(得分:2)

来自JOptionPane.showInternalInputDialog()上的JavaDoc,它由您使用的方法调用:

  

返回:   用户的输入,或null表示用户取消了输入

因此null表示输入被取消。

要检查null或空输入,首先检查for null然后检查为空,因为在null上调用isEmpty()将导致NPE。

请记住,||是短路运算符,即它将从左到右计算表达式,并在条件成立时停止。因此if( queryName == null || queryName.isEmpty() )不会抛出NPE,因为如果queryName为空,则条件为真且永远不会调用isEmpty()

相比之下,单个管道|不是短路运算符,即无论左侧是否为真,都会评估两个表达式。因此queryName == null | queryName.isEmpty()可能仍会抛出NPE。

答案 1 :(得分:2)

请尝试将该行更改为:

,而不是if (queryName.isEmpty()) {
 if (queryName == null || queryName.isEmpty()) {

您最有可能收到错误的原因是queryName很可能是空的。因此,尝试在空对象上调用isEmpty()将为您提供空指针异常。