2013-04-25 50 views
0

我目前正在用Java寫一個簡單的程序來回答一個問題。問題說:如何在Java中實現適當的異常處理?

您正在修復文檔(以字符串表示)無法轉換爲正確的xml的錯誤。可能會出現此問題的原因之一:
A.某些字符在XML中失敗,或者在通過
B.文件的長度> 100個字符(他們是小文件)

然後,它列出了5個字符需要轉義(例如,用轉義序列替換''>'');)。

我已經編寫了部分代碼來替換帶有轉義符的特殊字符,但我不知道該如何處理長度。

if (length of string > 100) { 
    do what? 
} 

我想也許實現一個try catch語句,但是這是用於運行時異常正確嗎? (空指針等)。從設計的角度來看,在完成這個功能的同時,避免這個錯誤的最好方法是什麼?

+0

也許你正在考慮拋出異常,而不是捕捉異常 - >'throw' – SJuan76 2013-04-25 10:53:45

+0

try-catch正好用於不是RuntimeException類型的異常。 – 2013-04-25 10:53:53

+3

@TheodorosChatzigiannakis斷然不正確。 – 2013-04-25 10:54:16

回答

3

你是不是在這裏處理異常,而你應該拋出一個:

private static final int MAX_LENGTH = 100; 
// ... 

if (inputString.length() > MAX_LENGTH) { 
    throw new IllegalArgumentException(
     String.format("String is too large. Found %d characters, maximum is %d.", 
      inputString.length(), MAX_LENGTH)); 
} 

這是您通知您的方法,他們已經違反了API的用戶的典型方式。確保您的方法文檔指定該字符串不能超過100個字符。

+0

這就是我正在尋找的東西,我忘記了拋出異常。謝謝。 – user2319056 2013-04-25 10:58:17

+1

FWIW如果包含觀察到的字符串長度和限制,則異常消息將更加有用。例如。 '「字符串太大(找到532個字符,最大允許是100個字符)」'。從經驗上講,一個只說「不」的錯誤信息比告訴你爲什麼*的幫助更少(/更生氣)。 – 2013-04-25 11:22:21

+0

@AndrzejDoyle非常真實。爲簡潔起見,我省略了這些細節,但您完全正確。我已經編輯過。 – 2013-04-25 11:24:19

0

創建自己的異常類:

public class FileTooLongForXmlException extends Exception{ 
    public FileTooLongForXmlException() { 
     super("Your file is > 100 carac"); 
    } 
} 

然後你只是做:當事情特殊時應該發生

if (length of string > 100) { 
    throw new FileTooLongForXmlException(); 
} 
+1

......也許吧。如果可能的話,我總是嘗試使用現有的異常(如'IllegalArgumentException')。 – 2013-04-25 10:59:31

+0

嗯,我認爲這取決於,如果它是面向庫的,它可能是有用的創建自己的例外,但我同意這兩個答案都可以 – NeeL 2013-04-25 11:00:41

1

例外。你不應該使用異常來編寫代碼來控制你的業務邏輯(尤其是如果它是像NoEntityFound這樣的第三方異常,如果圍繞第三方異常拋出的規則發生變化呢?)。

如果長度是你需要停止並告訴用戶,拋出一個自定義異常,如真正的東西...

throw new IllegalStringLength("String length invalid"); 

但是,如果這是你可以做的,沒有拋出異常並處理得更優雅,我通常會說這樣做更好。它不像空指針或數據庫無法連接。

然後您必須捕獲上述異常並將其輸出給用戶(同樣,使用異常來控制應用程序流)。

1

如果我理解正確,您的函數將長度爲< 100的字符串轉換爲XML。所以從設計角度來看,當給定的字符串長度> = 100時,我發現拋出IllegalArgumentException沒有問題。

你不應該試圖繼續執行,爲什麼Exceptions會停止執行函數 - to保證符合該功能合同的正確結果。