Как написать try-catch? - PullRequest
       7

Как написать try-catch?

0 голосов
/ 03 января 2012

У меня есть метод Java, который шифрует строку:

public String getCurrency(String hash){
                try {
                    MessageDigest md = MessageDigest.getInstance("SHA-256");
                     md.update(hash.getBytes());

                     byte byteData[] = md.digest();

                     /** convert the byte to hex format */
                     StringBuilder sb = new StringBuilder();
                         for (int i = 0; i < byteData.length; i++) {
                     sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
                     }              
                    return sb.toString();
                } catch (NoSuchAlgorithmException ex) {
                    ex.printStackTrace();
                }
              return sb.toString();                
            }

Я использую Netheans IDE. Проблема в том, что когда я пытаюсь скомпилировать, появляется ошибка, что я должен создать try-catch оператор для этой части ("SHA-256").

Когда я создаю его с помощью Netbeans, появляется следующий код:

public String getCurrency(String hash){
                try {
                    MessageDigest md = MessageDigest.getInstance("SHA-256");
                     md.update(hash.getBytes());

                     byte byteData[] = md.digest();

                     /** convert the byte to hex format */
                     StringBuilder sb = new StringBuilder();
                         for (int i = 0; i < byteData.length; i++) {
                     sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
                     }              
                    return sb.toString();
                } catch (NoSuchAlgorithmException ex) {
                    ex.printStackTrace();
                }
              return sb.toString();                
            }

Теперь, когда я снова пытаюсь скомпилировать код, появляется это сообщение об ошибке:

"переменная sb не объявлена"

Как правильно вернуть зашифрованную строку?

Ответы [ 3 ]

2 голосов
/ 03 января 2012

Как уже говорили другие, проблема в том, что ваша переменная sb определена в блоке try, поэтому доступна только там.Перемещение объявления за пределы блока try сделает ваш код компилируемым, но я сомневаюсь, что это желаемое поведение.

Что произойдет, если произойдет исключение при вызове MessageDigest.getInstance("SHA-256"): NoSuchAlgorithmException перехватываетсясогласно вашему улову, трассировка стека печатается в System.err, и ваш метод с радостью возвращает toString() пустого StringBuilder, то есть пустого String.Ваш код, вызвавший этот метод, не знает о возбужденном исключении и не может обработать исключение.

Альтернативы (хотя то, что лучше всего, полностью зависит от вашего приложения):

  • let метод выдает исключение и выполняет надлежащую обработку ошибок вне этого метода
  • перехватывает исключение в этом методе, как вы это делали сейчас, но возвращает null вместо пустого String, чтопозволяет вызывающему методу распознавать, что что-то пошло не так.

Хорошей отправной точкой для Exceptions является Swing tutorial

1 голос
/ 03 января 2012

Вы должны объявить вашу переменную sb вне блока try / catch.

1 голос
/ 03 января 2012

Вы объявляете свой StringBuilder внутри блока try. Это означает, что его область действия ограничена этим блоком.

Объявите это до try

public String getCurrency(String hash) {
    StringBuilder sb = new StringBuilder();
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(hash.getBytes());
        byte byteData[] = md.digest();

        /** convert the byte to hex format */
        for (int i = 0; i < byteData.length; i++) {
            sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
        }              

        return sb.toString();
    } catch (NoSuchAlgorithmException ex) {
        ex.printStackTrace();
    }
    return sb.toString();                
}
...