在 Java 中,如果我想计算 MD5 和,我需要注意可能的异常:
try {
MessageDigest md = MessageDigest.getInstance("MD5");
// Do stuff
} catch (NoSuchAlgorithmException e) {
// Can't happen...
}
但是,根据 JVM 规范,必须支持 MD5,所以永远不应该抛出异常。是否有不同的访问模式可以让我编写更优雅的代码?
在 Java 中,如果我想计算 MD5 和,我需要注意可能的异常:
try {
MessageDigest md = MessageDigest.getInstance("MD5");
// Do stuff
} catch (NoSuchAlgorithmException e) {
// Can't happen...
}
但是,根据 JVM 规范,必须支持 MD5,所以永远不应该抛出异常。是否有不同的访问模式可以让我编写更优雅的代码?
您可能会忘记 Java 实现并使用 Guava: http://docs.guava-libraries.googlecode.com/git-history/v11.0/javadoc/com/google/common/hash/Hashing.html#md5()。在 Java 中,您不能完全忽略 Checked Exception。你要么抓住它,要么用“抛出异常”来装饰你的方法,或者得到一个不那么迂腐的库。对我来说,下面的番石榴变体以最少的仪式客户惊喜完成了工作。
// Its my problem, yuk...
public byte[] md5TheHardWay( String s ) {
try {
MessageDigest md = MessageDigest.getInstance( "MD5" );
// Do stuff
byte[] result = md.digest( s.getBytes() );
return result;
} catch ( NoSuchAlgorithmException e ) {
// Can't happen...
e.printStackTrace();
}
return null;
}
// Its your problem, yuk...
public byte[] md5ItsYourProblemClient( String s ) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance( "MD5" );
// Do stuff
byte[] result = md.digest( s.getBytes() );
return result;
}
// Its no problem...I like Guava.
public byte[] md5ThroughGuava( String s ) {
HashFunction md = Hashing.md5();
HashCode code = md.hashBytes( s.getBytes() );
return code.asBytes();
}
浏览 Guava 代码,有趣的是他们是如何做到这一点的。出于所有意图和目的,Guava 库编写者走“这是我的问题,yuk ...”路径,捕获了检查的异常,并将其转换为 RuntimeException。聪明有效。
// an excerpt from the Guava sourcecode
private static MessageDigest getMessageDigest(String algorithmName) {
try {
return MessageDigest.getInstance(algorithmName);
} catch (NoSuchAlgorithmException e) {
throw new AssertionError(e);
}
}
我有没有提到我喜欢番石榴?我爱番石榴。