【问题标题】:JOptionPane throwing error when cancelled取消时 JOptionPane 抛出错误
【发布时间】:2015-06-23 22:23:06
【问题描述】:

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

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;
            }
            ....
            ....

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

【问题讨论】:

  • queryName 很可能是 null 而不是空字符串。事实上,当您取消对话框时,您会选择 nothing(在大多数情况下是 null 的含义)。
  • 将 queryName.isEmpty() 替换为 string.IsNullOrEmpty(queryName)
  • 我尝试使用“if (queryName.isEmpty() || queryName == null) {”但没有成功。我会尝试你们两个提出的两个建议
  • 先测试空...
  • 首先检查空值!为什么我做 of(A || B) 或 if(B || A) 有什么关系?

标签: java nullpointerexception joptionpane


【解决方案1】:

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

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

因此null 表示输入被取消。

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

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

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

【讨论】:

    【解决方案2】:

    不要使用if (queryName.isEmpty()) {,而是尝试将该行更改为:

     if (queryName == null || queryName.isEmpty()) {
    

    您最有可能收到错误的原因是queryName 很可能为空。所以尝试在空对象上调用isEmpty() 会给你一个空指针异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      相关资源
      最近更新 更多