2014-04-28 129 views
0

我對異常處理相對較新,這是我的問題:我正在用Java編寫一個應用程序,用戶必須在各個面板上的各個字段中輸入數據,所有這些都在同一個框架上。每個面板都有一個保存按鈕。在他們按下「保存」後,將以數據爲屬性創建對象。每一個setter方法都會檢查數據(字符串必須少於一定的長度,整數必須以特定的間隔等),如果不正常,則拋出異常(我創建了自己的BadDataException類型)。這些例外情況一直回到應該處理(顯示)它們的框架。異常處理(或記錄)

所以,這裏是一個問題:如果用戶在多個領域輸入錯誤的數據,我怎麼能向他展示他犯錯的所有領域?現在我所得到的是第一個拋出異常的消息(我知道它應該像那樣)。我是否必須在面板上添加一些檢查(我認爲這樣做不太合適),或者有什麼方法可以在按下「保存」後「記錄」所有異常?如果我能做到這一點,那麼我將能夠將它們全部顯示在主框架的標籤上。

我想問題已經夠清楚了,但我寫了一些簡單的代碼來說明。

public class MyFrame extends JFrame { 

private JTextField stringFieldOne; 
private JTextField stringFieldTwo; 

public MyFrame() { 

    stringFieldOne = new JTextField(); 
    this.add(stringFieldOne); 

    stringFieldTwo = new JTextField(); 
    this.add(stringFieldTwo); 

    JButton saveButton = new JButton(); 
    saveButton.addActionListener(new SaveButtonListener()); 
    this.add(saveButton); 

}//constructor 

private void save() { 

    SaveObject obj = new SaveObject(); 

    try { 
     obj.setStringOne(stringFieldOne.getText()); 
     obj.setStringTwo(stringFieldTwo.getText()); 
    } 
    catch (BadDataException bde) { 
     //what goes here??? 
    } 

}//method 

class SaveButtonListener implements ActionListener { 

    public void actionPerformed(ActionEvent evt) { 

     save(); 

    }//method 

}//class 

}//class 


public class SaveObject { 

private String theStringOne; 
private String theStringTwo; 

public void setStringOne(String someString) throws BadDataException { 

    if (someString.length() <= 20) { 
     theStringOne = someString; 
    } 
    else { 
     throw new BadDataException("The string you introduced has more than 20 characters"); 
    } 

}//method 

public void setStringTwo(String someString) throws BadDataException { 

    if (someString.length() <= 5) { 
     theStringTwo = someString; 
    } 
    else { 
     throw new BadDataException("The string you introduced has more than 5 characters"); 
    } 

}//method 

}//class 
+0

@chiccodoro:好吧,我明白你的意思。我現在可以爲我的應用程序啓動異常處理。謝謝! – user3580758

回答

2

在set方法中拋出異常可能不太適合您的要求。異常會打破正常的控制流程並進入異常處理控制流程。也就是說,所有其他數據檢查都不會執行。

通常情況下,您會驗證所有數據並將驗證結果收集到列表中。只有在完成所有驗證後,纔會在列表不爲空的情況下拋出異常。

例子:

private void save() { 
    SaveObject obj = new SaveObject(); 

    obj.setStringOne(stringFieldOne.getText()); 
    obj.setStringTwo(stringFieldTwo.getText()); 

    List<string> validationErrors = obj.validate(); 

    if (validationErrors.length > 0) { 
     // do whatever you need to do, e.g. throw an exception, or render the 
     // messages. 
    } 
}