如何写try-catch?

时间:2012-01-02 21:21:17

标签: java try-catch

我有加密字符串的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();                
            }

现在,当我再次尝试编译代码时,会出现此错误消息:

  

“varible sb未声明”

如何正确返回加密字符串?

3 个答案:

答案 0 :(得分:2)

正如其他人已经说过的那样,问题是你的sb变量是在try块中定义的,因此只能在那里访问。在try块之外移动声明将使您的代码编译,但我怀疑它是所期望的行为。

如果在调用MessageDigest.getInstance("SHA-256")时发生异常将会发生什么:NoSuchAlgorithmException被捕获捕获,堆栈跟踪将打印到System.err,您的方法会愉快地返回{ {1}}空toString(),空StringBuilder。调用该方法的代码不知道引发的异常,也无法处理异常。

替代品(尽管最好的完全取决于您的应用):

  • the method throw the exception并在该方法之外进行正确的错误处理
  • 像现在一样捕获该方法中的异常,但返回String而不是空null,这允许此方法的调用者识别出错的地方。

String上的一个不错的起点是Swing tutorial

答案 1 :(得分:1)

您在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();                
}

答案 2 :(得分:1)

您必须在try / catch块之外声明变量sb