4

我想用来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 实现不能从指定的提供程序获得。
在此站点http://docs.oracle.com/javase/6/docs/api/java/security/MessageDigest.html上找到getInstance

我已经重新安装了最新的 java jdk1.7.0_21 和不同版本的 eclipse,但错误仍然存​​在。其他一切在 Eclipse 上运行良好。

我不知道我还能做什么。

4

3 回答 3

19

错误消息很清楚:代码无法编译未解决的编译问题),因为您没有处理NoSuchAlgorithmException可以由MessageDigest.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 的“问题”视图中可见),并且尽管 Eclipse 在启动程序之前警告了您这一点,但您还是选择了启动您的程序。因此,您尝试执行不应该编译的代码。

编辑:修复 NoSuchAlgorithmException 代码中的错字

于 2013-04-21T17:11:06.780 回答
2

除了这里的其他答案

某些算法不适用于某些算法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;
}
于 2013-04-21T17:34:55.167 回答
1

您应该处理异常:

try {

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

} catch(NoSuchAlgorithmException x) {
  // do proper exception handling
}
于 2013-04-21T17:13:10.057 回答