MessageDigest NoSuchAlgorithmException

时间:2013-04-21 17:08:59

标签: java

我想使用MessageDigest来获取MD5哈希,但是我收到错误。

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

下的http://docs.oracle.com/javase/6/docs/api/java/security/MessageDigest.html网站上找到

我重新安装了最新的java jdk1.7.0_21和不同版本的eclipse,但错误仍然存​​在。日食上的其他一切都很顺利。

我不知道我还能做些什么。

3 个答案:

答案 0 :(得分:14)

错误消息很明确:代码无法编译未解决的编译问题),因为您没有处理可以检查的已检查异常NoSuchAlgorithmExceptionMessageDigest.getInstance()抛出。

将此异常添加到main方法的throws子句中,或者捕获它:

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

中代码中的拼写错误

答案 1 :(得分:1)

您应该处理异常:

try {

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

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

答案 2 :(得分: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;
}