未捕获java parseInt异常

未捕获java parseInt异常,java,validation,loops,error-handling,Java,Validation,Loops,Error Handling,我试图用相同的响应捕获parseInt请求的所有异常,因此如果字符串没有解析为int,它将执行catch下的代码。这将形成一个简单的验证循环,要求他们在每次试图离开字段时都重试,但没有输入有效的int。此时,它将在系统控制台中引发异常,但不会返回我预先配置的错误消息并运行其关联代码 public static void main(String[] args){ //draw and show the GUI JFrame GUI = new JFrame(); G

我试图用相同的响应捕获parseInt请求的所有异常,因此如果字符串没有解析为int,它将执行catch下的代码。这将形成一个简单的验证循环,要求他们在每次试图离开字段时都重试,但没有输入有效的int。此时,它将在系统控制台中引发异常,但不会返回我预先配置的错误消息并运行其关联代码

    public static void main(String[] args){
    //draw and show the GUI
    JFrame GUI = new JFrame();
    GUI.setTitle("New Provider Interface");
    GUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final JTextField textID = new JTextField("providerID ", 20);
    final JTextField textName = new JTextField("Provider Name ", 20);
    FocusGrabber fgID = new FocusGrabber(textID);
    GUI.add(textID);
    GUI.add(textName);
    GUI.pack();
    GUI.setVisible(true);
} 
    textID.addFocusListener(new FocusListener(){ @Override
        public void focusGained(FocusEvent e) {/* */}
        @Override public void focusLost(FocusEvent e) {
                if (!e.isTemporary()) {
                String  checkID = textID.getText();
                Boolean validID = false;
                if (checkID.isEmpty()){JOptionPane.showMessageDialog(mainFrame, "Please enter a valid ID."); fgID.run();}
                else while (validID = false){try {
                        String sID = textID.getText();
                        int iID = Integer.parseInt(sID);
                    }catch (Exception e1){
                        JOptionPane.showMessageDialog(mainFrame, checkID + "is not a valid ID. Please try again.");
                        fgID.run();
                    }finally {validID= true;}
    }    }    }    }    );

最终
中的代码将运行,即使存在
异常

,也不会执行代码抛出异常或非最终块。
对于上面的程序,当第一次给出有效ID时,将不会抛出异常,但最终将执行块,然后将validId设置为true。在第二次调用中,传递了无效ID,但由于validId为true,因此将忽略while循环。通过在第一个实例中传递无效ID来检查a代码,以检查是否捕获了任何异常。

一般的答案是,
最终
块将始终执行,这允许您的循环退出,这对您来说是幸运的

请仔细查看和了解更多详细信息

另一个问题是,您使用
validID=false
作为
while循环的退出条件,这是一个赋值,因此退出条件总是
false
,而
while循环将永远不会执行

while循环
将导致程序挂起,因为它将在用于监视使用输入和绘制请求的事件调度线程的上下文中退出

取而代之的是,您应该考虑使用<代码>输入验证程序< /C> >,这将允许您在失去焦点之前有效地激活字段的值,如果需要,防止字段失去焦点,直到它是有效的

有关更多详细信息,请参阅


我还建议您查看
JSpinner
JFormattedTextField

我认为最好多检查一下:finally用于-您想关闭连接,比如文件,数据库无论代码崩溃的程度有多严重,您都需要以优雅的方式处理一些事情-限制损失“最终”删除,程序行为没有任何变化。您需要的是一种方法来知道是否发生了
异常
。您可以通过引入一个
布尔parseSucceed
初始化为
false
,并在
parseInt
之后设置为
true
。因此,在捕获后,如果(parseSucceed)validd=true,则可以执行
使用JSpinner、JFormattedTextField和/或InputVerifier使您的easierA InputVerifier不仅可用于验证字段的内容,还可用于限制从逻辑上失去焦点。您的while循环非常危险,可能导致程序挂起。这不是SSCE。我们不能复制/粘贴/编译和执行代码。我们没有访问FocusGrabber类的权限。那门课与所陈述的问题无关。SSCCE是您自己编译的代码,用于验证它是否演示了您所询问的问题。此外,变量名不应以大写字符开头。大多数是正确的,但不是所有的。保持一致。谢谢你的案例提示,我怀疑是这样的,但小写字母看起来错了,所以我等着看是否有人说出了我的想法。