簡體   English   中英

Java類設計和處理異常

[英]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種情況:

  1. main確實知道如何處理例外情況(拋出異常或返回非法值)
  2. main與此案無關。

如果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操作拋出IOExceptiongetChoice方法已嘗試但未能讀取該選項。 所以它必須拋出異常。 因此,該方法不應該嘗試處理IOException本身,而應該讓它的調用者處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM