2013-06-04 72 views
11

我有一個小方法,除其他外還將字符串轉換爲整數。由於字符串是方法的參數,我想確保該字符串是可轉換的。所以我只是想知道什麼是最安全和/或最快的方式。將字符串轉換爲整數安全的方式


A版本:剛剛離開它,因爲它是和承擔的風險(這我試圖避免)

public static int stringToInt(String param) { 
     return Integer.valueOf(param); 
} 

(在速度方面,什麼樣的區別會使其向版本B和C)


版本B:趕上前ception

public static int stringToInt(String param) { 
     try { 
       return Integer.valueOf(param); 
     } catch(NumberFormatException e) { 
       return -1; 
     } 
} 

C版:檢查字符串看到的每一個字母,如果它是一個位數或不

public static int stringToInt(String param) { 
     for(char c : param.toCharArray()) { 
       if(!Character.isDigit(c)) 
         return -1; 
     } 
     return Integer.valueOf(param); 
} 

注意,參數必須是一個正數並且-1應該是我的小程序中的「錯誤值」,換句話說,所有這三個版本的方法在我的程序中都能很好地工作。

我對任何其他建議都非常樂意,如果您認爲自己更好,那麼請隨時創建自己的版本。

非常感謝您的支持。

+2

第一個版本僅僅是「危險的」,如果錯誤是不正確的行爲,如果你不想搭上'NumberFormatException'更高的地方了變化。拋出異常可能是對錯誤輸入的完美迴應。 –

+0

在我看來,第一個是最快的,但是如果你輸入一個非數字值,它會拋出一個異常。第二個對我來說是最好的,因爲它有一個防止異常停止你的程序的機會。最後一個,它只是第二個的長版。 –

+0

版本C在負整數上失敗 – bengoesboom

回答

7

首先,請注意,版本C不是防彈的:它會拒絕負數,並且不會捕獲太大的數字。

版本B沒問題,但它使呼叫者更改編碼風格:而不是捕獲錯誤並將其與其他錯誤一起處理,呼叫者需要始終檢查-1。在讀取多個整數的情況下,這可能不是最理想的,但錯誤處理並不取決於哪一個失敗。此外,使用API​​的新編碼人員可能會忘記檢查-1,並且無意中使用錯誤代碼。

這就是爲什麼我會留在第一個選項:使用A版本的代碼對於任何知道Java API的人都會立即熟悉,而不需要了解您的函數內部會發生什麼。

+1

+1爲「熟悉」 – Craig

+0

OP指出他們的實際方法是「其他事情」。它可能不如'stringToInt'命名。顯式聲明拋出的異常可能是一個好主意,除非方法名稱確實如'stringToInt'清晰(當然javadoc可以配合上述所有內容) – Gus

2

我相信一個修改的B拋出一個異常而不是返回-1將是最好的選擇。將異常拋向關卡是一件好事,它可以被處理以向用戶發送適當的響應。返回像-1這樣的值會使你的代碼容易出錯。假設一個不同的程序員正在使用你的方法,他/她只有你方法的簽名。所以從簽名中不清楚他/她應該編碼以處理異常或錯誤情況。但是,如果拋出異常並將其添加到方法聲明中,那麼它將使其他程序員能夠正確使用您的方法以及所需的異常處理。對我來說,這看起來是最好的:

public static int stringToInt(String param) throws NumberFormatException { 
     try { 
       return Integer.valueOf(param); 
     } catch(NumberFormatException e) { 
       // return -1; 
       throw e; 
     } 
} 
+10

爲什麼要捕捉異常呢? – Craig