Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MessageDigest NoSuchAlgorithmException

Tags:

java

I want to use MessageDigest to get a MD5 hash, but I get an error.

import java.security.MessageDigest;

public class dn {
  public static void main(String[] args) {
    MessageDigest md = MessageDigest.getInstance("MD5");
  }
}

Error:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Unhandled exception type NoSuchAlgorithmException

Error is referring to
NoSuchAlgorithmException - if a MessageDigestSpi implementation for the specified algorithm is not available from the specified provider.
found on this site http://docs.oracle.com/javase/6/docs/api/java/security/MessageDigest.html under getInstance

I have reinstalled the latest java jdk1.7.0_21 and a different version of eclipse, but the error persists. Everything else runs fine on eclipse.

I don't know what else could i do.

like image 458
user2304850 Avatar asked Nov 30 '22 01:11

user2304850


2 Answers

The error message is clear : the code doesn't compile (Unresolved compilation problem) because you're not handling the checked exception NoSuchAlgorithmException that can be thrown by MessageDigest.getInstance().

Either add this exception to the throws clause of the main method, or catch it:

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");
    }
}

Note that this is a compilation error. You chose to launch your program despite the presence of compilation errors (visible in the "Problems" view of Eclipse), and despite the fact that Eclipse warned you about that before launching the program. So you tried executing code which doesn't compile, which you shouldn't do.

EDIT: fixed the typo in the code in NoSuchAlgorithmException

like image 117
JB Nizet Avatar answered Dec 01 '22 14:12

JB Nizet


In addition to other answers here

Certain algorithms would not be available with some JVM

To make it truly portable application you should do this

public boolean isMDAvailable(String s)
{
    boolean success=true;
    try{MessageDigest.GetInstance(s);}
    catch(NoSuchAlgorithmException x)
    {
         success=false;
    }
    return success;
}

Now you can get any available MD algorithm with this method

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;
}
like image 41
Anirudha Avatar answered Dec 01 '22 16:12

Anirudha