Java 如何编写try-catch?

Java 如何编写try-catch?,java,try-catch,Java,Try Catch,我有一个加密字符串的java方法: public String getCurrency(String hash){ try { MessageDigest md = MessageDigest.getInstance("SHA-256"); md.update(hash.getBytes()); byte byteData[] = md.d

我有一个加密字符串的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();                
            }
现在,当我再次尝试编译代码时,会出现以下错误消息:

“可变sb未声明”


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

您在
try
块中声明了
StringBuilder
。这意味着其范围仅限于该块

尝试之前声明它

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();                
}
公共字符串getCurrency(字符串哈希){
StringBuilder sb=新的StringBuilder();
试一试{
MessageDigest md=MessageDigest.getInstance(“SHA-256”);
md.update(hash.getBytes());
byte byteData[]=md.digest();
/**将字节转换为十六进制格式*/
for(int i=0;i
您正在
try
块中声明您的
StringBuilder
。这意味着其范围仅限于该块

尝试之前声明它

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();                
}
公共字符串getCurrency(字符串哈希){
StringBuilder sb=新的StringBuilder();
试一试{
MessageDigest md=MessageDigest.getInstance(“SHA-256”);
md.update(hash.getBytes());
byte byteData[]=md.digest();
/**将字节转换为十六进制格式*/
for(int i=0;i
您必须在try/catch块之外声明变量
sb

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

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

如果调用
MessageDigest.getInstance(“SHA-256”)
时发生异常,会发生什么情况:捕获捕获
NoSuchAlgorithmException
,堆栈跟踪打印到
系统.err
,并且您的方法愉快地返回空
StringBuilder的
toString()
,哪个是空的
字符串
。调用该方法的代码不知道引发的异常,因此无法处理该异常

备选方案(尽管最佳方案完全取决于您的应用程序):

  • 让我们在该方法之外进行适当的错误处理
  • 像现在一样捕获该方法中的异常,但返回
    null
    而不是空的
    字符串
    ,这允许此方法的调用方识别出出错的地方

异常
的一个很好的起点是

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

如果调用
MessageDigest.getInstance(“SHA-256”)
时发生异常,会发生什么情况:捕获捕获
NoSuchAlgorithmException
,堆栈跟踪打印到
系统.err
,并且您的方法愉快地返回空
StringBuilder的
toString()
,哪个是空的
字符串
。调用该方法的代码不知道引发的异常,因此无法处理该异常

备选方案(尽管最佳方案完全取决于您的应用程序):

  • 让我们在该方法之外进行适当的错误处理
  • 像现在一样捕获该方法中的异常,但返回
    null
    而不是空的
    字符串
    ,这允许此方法的调用方识别出出错的地方
关于
异常
的一个很好的起点是