当前位置: 首页 > 知识库问答 >
问题:

(Java)GUI NumberFormatException捕获异常,但挂起窗口

厍晋鹏
2023-03-14

对GUI非常陌生。试图使我的代码在用户将textfield留空或用户未输入整数时捕获异常。当我使用InputMismatchException时,GUI窗口将继续工作,但NetBeans上的输出窗口将出现大量错误。

当我将catch块切换到NumberFormationException时,输出窗口上没有任何内容,但是GUI窗口停止工作,因为我不能输入任何内容、更改任何内容,甚至在不强制停止运行的情况下关闭窗口。

private void createAnswerField()
{
    answerField = new JTextField(5);

    answerField.addActionListener(new CustomActionListener());
}

/**
 * When the user presses enter in the text field, this is the class that makes the rest happen
 */
class CustomActionListener implements ActionListener
{
    @Override
    public void actionPerformed(ActionEvent event)
    {
        boolean correctInput = false;

        while(!correctInput)
        {
            try
            {   
                userInput = Integer.parseInt(answerField.getText());
                correctInput = true;

                if (userInput == getCorrectAnswer())
                {
                    if (counter > 1) //Fixes the try/tries problem
                    {
                        answerLabel.setText("Yay! It took you " + counter + " tries.");  
                    }
                    else
                    {
                        answerLabel.setText("Yay! It took you " + counter + " try."); 
                    }
                }
                else //hangs up here, never changes the answerLabel
                { //I believe I need to clear userInput or something of that nature
                    answerLabel.setText("Incorrect. Please try again.");
                    counter ++;
                }
            }
            catch(NumberFormatException e)
            {
                answerLabel.setText("Integers only please!");
                correctInput = false;
            }
        }
    }
}

编辑:当我使用InputMismatch时,它给我的错误是:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "a"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at guiapp.MathTutor$CustomActionListener.actionPerformed(GUIApp.java:167)
at javax.swing.JTextField.fireActionPerformed(JTextField.java:508)
at javax.swing.JTextField.postActionEvent(JTextField.java:721)
at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:836)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2882)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2929)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2845)
at java.awt.Component.processEvent(Component.java:6302)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
at java.awt.Component.dispatchEventImpl(Component.java:4752)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

共有1个答案

上官波鸿
2023-03-14

您可以很好地捕捉NFE,但是仍然会陷入while循环。这样,您将抛出无限个异常,因为您将correctinput设置为false,这将继续循环。

 类似资料:
  • 我只是在练习java,目前我正在试验getter/setter方法和构造函数。java程序的工作原理是,我能够将用户输入存储到对象中,但当我将字符串“Dice and rollers”输入到gametype字符串变量中时,会出现一个挂起的未捕获异常InputMismatch错误。 有人能给我解释一下这是为什么吗? 另外,我在下面分享了我的源代码。 上面的是超类,下面的源代码是构造函数和getter

  • 问题内容: 为什么Java中的某些异常未被捕获?这是代码由于没有处理的异常而完全失败。(Java版本1.4)。 我得到一个 但这有效 我懂了 我以为捕获异常会捕获所有异常?如何捕获Java中的所有异常? 问题答案: 因为某些异常不是源自-例如和。 基本上,类型层次结构是: 只能抛出派生类,因此,如果您抓住,那实际上就可以抓住一切。 ,以及任何异常,从获得 其他 比那些源自数作为 检查的异常 -他们

  • 我需要应用程序将错误写入位置。有没有我可以用Java异常处理做这件事?我已经在抛接IOerrors了,所以我不知道问题出在哪里……? 我正在从标准输入读取数据,并将其压缩并写入标准输出。 写入/dev/full不是引发异常...有没有关于如何引发异常的想法?

  • 为什么Java中的一些异常不被捕获?这是完全失败的代码,有一个未处理的异常。(Java版本1.4)。 我在线程“main”java中得到了一个 但这行得通 我在java中没有发现任何方法错误。lang.NoSuchMethodError: 我以为捕获异常会捕获所有异常?如何捕获java中的所有异常?

  • 问题内容: 说我有以下 遇到SpecificException会发生什么?它是否首先将其捕获为通用异常,然后捕获特定异常? 还是只在忽略通用异常的同时捕获SpecificException。 我不希望泛型和特殊异常都被捕获。 问题答案: 否。所有异常都将被第一个块捕获。第二个将永远不会到达(编译器会识别出来,由于代码无法到达而导致错误)。如果要特别对待,则必须采用另一种方法: 然后,第一个块将捕获

  • 我的RMI服务器接口声明了一个方法foo(),该方法被声明为引发RemoteException和Exception,如下所示: 服务器实现为: 我的客户端在服务器上调用foo: 现在,当我运行客户端时,我得到: 从java类型的foo()中获取异常。rmi。异常异常:未声明的检查异常;嵌套的例外是:java。伊奥。InterruptedIOException:操作超时 Java文档是这样说的。rm