2012-01-02 58 views
0

我有加密的字符串的Java方法:如何编写try-catch?

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。问题是,当我尝试编译错误出现时,我必须为此部分("SHA-256")创建try-catch语句。

当我创建它使用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某人未声明”

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

回答

1

您正在声明块内的StringBuilder以内块。这意味着它的范围仅限于该块。

声明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();     
} 
+0

谢谢你的工作! – 2012-01-02 21:25:25

1

您必须声明你的变量sb外的try/catch块之前它。

2

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

如果当你调用MessageDigest.getInstance("SHA-256")发生异常会发生的事情:NoSuchAlgorithmException由你钓到的鱼钓到,堆栈跟踪打印到System.err和你的方法愉快地返回一个空StringBuilder,这是空StringtoString()。您调用该方法的代码不知道引发的异常,并且无法处理异常。

替代品(虽然什么是最好的,完全取决于你的应用程序):

  • the method throw the exception,并做适当的错误方法外处理
  • 捕获异常在方法,你现在做了,但是返回null而不是空的String,它允许此方法的调用者识别出错。

Exceptions一个很好的出发点是Swing tutorial