2013-04-21 144 views
1

我想使用MessageDigest來獲得MD5哈希,但我得到一個錯誤。MessageDigest NoSuchAlgorithmException

import java.security.MessageDigest; 

public class dn { 
    public static void main(String[] args) { 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    } 
} 

錯誤:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Unhandled exception type NoSuchAlgorithmException 

錯誤指的是
NoSuchAlgorithmException - 如果MessageDigestSpi實現指定算法不能從指定的供應商。
的getInstance

我重新安裝了最新的Java jdk1.7.0_21和不同版本的Eclipse,在這個網站http://docs.oracle.com/javase/6/docs/api/java/security/MessageDigest.html發現,但錯誤依然存在。其他的東西在日食上運行良好。

我不知道我還能做些什麼。

+0

在我的情況下,設備不支持SHA-224 – Hamidreza 2016-08-03 08:41:45

回答

12

該錯誤信息是明確的:代碼不編譯未解決的問題,編譯),因爲你不處理檢查異常NoSuchAlgorithmException可以通過MessageDigest.getInstance()被拋出。

要麼加入這一例外拋出的主要方法的條款,或趕上它:

public static void main(String[] args) throws NoSuchAlgorithmException { 
    ... 
} 

or 

public static void main(String[] args) { 
    try { 
     ... 
    } 
    catch (NoSuchAlgorithmException e) { 
     System.err.println("I'm sorry, but MD5 is not a valid message digest algorithm"); 
    } 
} 

注意,這是一個編譯錯誤。儘管存在編譯錯誤(可在Eclipse的「Problems」視圖中看到),但您選擇啓動程序,儘管在啓動程序之前Eclipse已經提醒您了。所以你試着執行不能編譯的代碼,你不應該這樣做。

編輯: 固定在代碼中的錯字在拋出:NoSuchAlgorithmException

+0

謝謝你,我不知道的try/catch可能是強制性的。 – user2304850 2013-04-21 17:15:23

+1

這是該語言的基本特徵。閱讀http://docs.oracle.com/javase/tutorial/essential/exceptions/ – 2013-04-21 17:16:17

1

你應該處理異常:

try { 

    MessageDigest md = MessageDigest.getInstance("MD5"); 
    //... 

} catch(NoSuchAlgorithmException x) { 
    // do proper exception handling 
} 
1

除了這裏其他的答案

一定的算法將是不可用的一些JVM

爲了使它成爲真正的便攜式應用程序,您應該這樣做

public boolean isMDAvailable(String s) 
{ 
    boolean success=true; 
    try{MessageDigest.GetInstance(s);} 
    catch(NoSuchAlgorithmException x) 
    { 
     success=false; 
    } 
    return success; 
} 

現在,您可以得到任何可用的MD算法,用這種方法

public MessageDigest getAvailableMessageDigest() 
{ 
    if(isMDAvailable("MD5")==true)return MessageDigest.GetInstance("MD5"); 
    else if(isMDAvailable("MD2")==true)return MessageDigest.GetInstance("MD2"); 
    else if(isMDAvailable("SHA-512")==true)return MessageDigest.GetInstance("SHA-512"); 
    else return null; 
} 
0

但這是例外真的總是需要的?

他們應該重載getInstance(String)方法,不扔Exceptions爲需要所有Java實現中要實現的算法(如MD5 SHA-1),以避免這種不必要的異常處理。

相關問題