【问题标题】:MessageDigest NoSuchAlgorithmExceptionMessageDigest NoSuchAlgorithmException
【发布时间】:2013-04-21 17:08:58
【问题描述】:

我想使用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 上运行良好。

我不知道我还能做什么。

【问题讨论】:

  • 在我的情况下,设备不支持 SHA-224

标签: java


【解决方案1】:

错误信息很清楚:代码无法编译未解决的编译问题)因为您没有处理可以抛出的检查异常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 中代码中的错字

【讨论】:

【解决方案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;
}

【讨论】:

    【解决方案3】:

    你应该处理异常:

    try {
    
       MessageDigest md = MessageDigest.getInstance("MD5");
       //...
    
    } catch(NoSuchAlgorithmException x) {
      // do proper exception handling
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 2020-11-21
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多