[英]Java class design and handling Exceptions
我的getChoice()
方法從控制台獲取一個char輸入並將char返回給main()
。 應該getChoice()
只是拋出異常並讓main()
處理它:
static char getChoice() throws IOException
{
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
return (char)br.read();
}
或者應該getChoice()
捕獲異常,處理它並返回一個char:
static char getChoice()
{
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
char temp;
try {
temp = (char)br.read();
} catch(IOException exc) {
System.out.println("Invalid Input");
temp = (char)0;
}
return temp;
}
從設計角度來看哪種方法更好? 有一個更好的方法嗎?
拋出異常似乎對我來說是更好的選擇,因為如果發生異常,返回默認值(或錯誤代碼,如果你願意)不會讓調用者知道在讀取用戶輸入時出錯。 使用像(char)0這樣的返回值作為錯誤代碼可以返回到沒有異常處理的語言。
也就是說,你應該考慮捕獲IOException
並拋出一些你自己的異常,它描述了錯誤。
例如 :
static char getChoice() throws UserInputException
{
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
char temp = (char)0;
try {
temp = (char)br.read();
}
catch (IOException ioEx) {
throw new UserInputException ("Error reading input", ioEx);
}
return temp;
}
第一個是更好的方式。 例外意味着發出異常情況。 返回值不是。 在第二個中,調用者必須知道在出現問題時返回0。 而且,0是有效的char值,這使得無法區分“輸入是'0'”和“有異常”。
並非使用BufferedReader讀取單個char是完全過度的:沒有什么可以緩沖的。
這取決於你最喜歡的風格。 在你特別的,非常簡單的情況下,我建議第一種方法,即只是拋出異常。
原因如下。 有2種情況:
如果main知道如何處理這種情況,2種方法非常相似:
// Catching exception
main(String[] args) {
try {
char c = getChoice();
// do A
} catch (IOException e) {
// do B
}
}
// Returning 0
main(String[] args) {
char c = getChoice();
if (c == 0) {
// do B
} else {
// do A
}
}
但是如果你返回0,你實際上關心的值是兩次:第一次進入getChoice()
,第二次進入main()
,在這兩種方法之間產生額外的耦合。
然而,即使main()
與錯誤的輸入無關。 在這種情況下,您的方法是:
main(String[] args) throws IOException {
char c = getChoice();
// do A
}
如您所見,代碼更簡單。 因此,您的選擇取決於您的調用者是否有理由捕獲異常的事實。 原因可以是處理它或包裝它與其他類型的例外。
應該何時拋出異常? 典型的建議是僅在特殊情況下拋棄它們。 但是什么算是特殊情況? 我建議一個不同的規則(最初由Herb Sutter提出,我相信):當且僅當,替代方案是不能按指定方法執行的操作。 這將問題從模糊(什么是例外)轉變為可能精確的東西(規范說的是什么)。
那么你的getChoice
方法的規范是什么? 它讀了一個選擇。 考慮該方法無法讀取選擇的情況。 該方法不能為該情況return
選項,因為它無法讀取該選項。 所以它必須拋出異常。 當read
操作拋出IOException
, getChoice
方法已嘗試但未能讀取該選項。 所以它必須拋出異常。 因此,該方法不應該嘗試處理IOException
本身,而應該讓它的調用者處理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.