我正在尝试使用相同的响应捕获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;}
} } } } );
答案 0 :(得分:0)
即使有finally
,Exception
中的代码也会always运行。
答案 1 :(得分:0)
无论代码是否抛出异常,都将执行finally块。 对于上面的程序,当第一次给出有效ID时,异常不会抛出,但最后会执行块,然后将validId设置为true。在第二次调用时,传递了无效ID但由于validId为true,而循环将被忽略。通过在第一个实例中传递无效ID来检查代码,以检查是否捕获到任何异常。
答案 2 :(得分:0)
一般的答案是,finally
块将始终被执行,这允许你的循环退出,这是幸运的。
详细了解try-catch和try-finally了解详情
另一个问题是,您使用validID = false
作为while loop
的退出条件,这是一项作业,因此退出条件始终为false
和{{ 1}}永远不会执行
while-loop
否则会导致程序挂起,因为它会在事件调度线程的上下文中退出,该线程用于监视使用输入和绘制请求。
相反,您应该考虑使用while-loop
,这样您就可以在字段即将失去焦点之前验证字段的值,如果您愿意,可以防止字段失去焦点,直到它为止有效
有关详细信息,请参阅How to validate input
我还建议您查看InputVerifier
和JSpinner