我想使用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
我重新安装了最新的java jdk1.7.0_21和不同版本的eclipse,但错误仍然存在。日食上的其他一切都很顺利。
我不知道我还能做些什么。
答案 0 :(得分:14)
错误消息很明确:代码无法编译(未解决的编译问题),因为您没有处理可以检查的已检查异常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的“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;
}