2015-04-26 106 views
0

我想捕獲所有異常到一個parseInt請求與相同的響應,所以如果字符串不解析爲一個int,它執行catch下的代碼。這會產生一個簡單的驗證循環,要求他們每次嘗試離開該字段時都要再次嘗試,而不必輸入有效的int。現在它會在系統控制檯中拋出異常,但不會返回我的預配置錯誤消息並運行相關的代碼。java parseInt異常沒有被捕獲

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

使用JSpinner的,JFormattedTextField上和/或InputVerifier使你更容易 – MadProgrammer

+0

一個InputVerifier可以用來不僅VERI fy你的領域的內容,但限制從失去焦點audiblematically – MadProgrammer

+0

你的while循環是非常危險的,可能導致你的程序掛起 – MadProgrammer

回答

0

finally的代碼將always運行,即使有一個Exception

+0

我認爲它會更好地展現它:當你想關閉一個連接,說文件,數據庫時,不管代碼崩潰多麼糟糕,你都需要一些東西來優雅地處理 - 最大限度地減少損失 –

+0

'終於',程序行爲沒有改變。 –

+0

你需要的是一種知道是否有「例外」的方法。你可以通過引入'boolean parseSucceed'來初始化爲'false',然後在'parseInt'後面加上'true'。所以在你抓到後你可以做'if(parseSucceed)validID = true;' – grebesche

0

無論代碼是否拋出異常或者不是finally塊都會被執行。 對於上面的程序,當第一次給出有效的ID時,異常不會拋出,但最終會執行block,然後將validId設置爲true。在第二次調用中,無效ID已被傳遞,但由於validId爲true,而循環將被忽略。通過在第一個實例中傳遞無效標識來檢查代碼,以檢查是否有任何異常被捕獲。

0

一般的答案是,finally塊將始終執行,這是允許您的循環退出,這是幸運的。

採取在try-catch定睛一看,try-finally更多細節

的另一個問題是,你使用validID = false作爲退出條件爲您while loop,這是一個任務,讓你的退出條件總是falsewhile-loop將永遠不會執行

while-loop否則會導致您的程序掛起,因爲它將在用於監視使用輸入和繪製請求的事件分派線程的上下文中退出。

相反,你應該考慮使用InputVerifier,這樣可以讓你到外地的有效價值是即將失去焦點之前,如果你想這樣做,防止現場從失去焦點,直到它是有效的

有關詳細信息,請參見

How to validate input

我也建議你看看JSpinnerJFormattedTextField