2012-01-02 59 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