LINUX.ORG.RU

[Java] Странные исключения в стандартной библиотеке

 


0

1
public static final String makeHash(String password) {
    	MessageDigest md;
    	md = MessageDigest.getInstance("SHA-256"); // Бросает NoSuchAlgorithmException
    	md.update(password.getBytes("UTF-8")); // UnsupportedEncodingException

По докам огакла все правильно же делаю. Куча туториалов думают так же, стековерфлоу напичкан аналогичными примерами. Жаву пробовал и оригинальную и открытую.

С getBytes побороли при помощи Charset.forName(«UTF-8») (что ненормально же совсем), второе пока еще трепыхается.

Собственно, WTF?

PS. оригинальная: SE6u29, открытая: 1.6.0.0_b22

★★

Последнее исправление: GateKeeper (всего исправлений: 1)

Бросает NoSuchAlgorithmException

А это разве не checked exception? Тогда где обработка? Лень глядеть.

что ненормально же совсем

Упоролся?

baverman ★★★
()
    public static final String makeHash(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException{
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(password.getBytes("UTF-8")); 
        return md.digest().toString();
    }
kovrik ★★★★★
()
Ответ на: комментарий от kovrik

Ну а где вызываешь метод, что-то вроде такого:

try {
    makeHash("test");
} catch (NoSuchAlgorithmException e) {
    TRACER.error("makeHash() NoSuchAlgorithmException ", e);
} catch (UnsupportedEncodingException e) {
    TRACER.error("makeHash() UnsupportedEncodingException ", e);
}

kovrik ★★★★★
()
Ответ на: комментарий от kovrik

Эклипс. В том и дело, что он вроде как мегафичастый и throws мог бы и сам объявить. А то хрень какая-то получается - каждый раз лезть в доку, выяснять, что бросает метод, дописывать РУКАМИ в throws (не хочу я его тут обрабатьывать, это будет как в твоем примере выше).

GateKeeper ★★
() автор топика
Ответ на: комментарий от kovrik

До этого еще не дошло. Пока ругается только на объявление метода. Разобрались, дописал throws.

GateKeeper ★★
() автор топика
Ответ на: комментарий от baverman

Упоролся?

Нет ты! getBytes(String arg0) это обертка над getBytes(Charset charset). Для того и была придумана, чтобы не использовать Charset.forName(), а подавать сразу строковое имя.

GateKeeper ★★
() автор топика
Ответ на: комментарий от GateKeeper

Ты же понимаешь, что чудес не бывает. Если она у тебя не работает (про что вообще первый раз слышу), значит или это не обертка, или у тебя экзотическая система или кривые руки.

baverman ★★★
()
Ответ на: комментарий от GateKeeper

Я бы сделал как-то так:

public final class Utils {
// .....
    public static String makeHash(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException{
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(password.getBytes("UTF-8"));
        byte[] digest = md.digest();
	StringBuffer hexString = new StringBuffer();
	for (int i=0;i<digest.length;i++) {
            hexString.append(Integer.toHexString(0xFF & digest[i]));
	}
        return hexString.toString();
    }
}

kovrik ★★★★★
()
Ответ на: комментарий от kovrik

уточнение:

public final class Utils {

    private Utils() {
        throw new AssertionError();
    }

    //...

    public static String sha256(String password) {
        byte[] digest = {};
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            md.update(password.getBytes("UTF-8"));
            digest = md.digest();
        } catch (NoSuchAlgorithmException e) {
            TRACER.error("sha256() NoSuchAlgorithmException! ",e );
        } catch (UnsupportedEncodingException e) {
            TRACER.error("sha256() UnsupportedEncodingException! ",e );
        }
	StringBuffer hexString = new StringBuffer();
	for (int i=0;i<digest.length;i++) {
            hexString.append(Integer.toHexString(0xFF & digest[i]));
	}
        return hexString.toString();
    }
}
kovrik ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.