我有加密字符串的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未声明”
如何正确返回加密字符串?
答案 0 :(得分:2)
正如其他人已经说过的那样,问题是你的sb
变量是在try
块中定义的,因此只能在那里访问。在try
块之外移动声明将使您的代码编译,但我怀疑它是所期望的行为。
如果在调用MessageDigest.getInstance("SHA-256")
时发生异常将会发生什么:NoSuchAlgorithmException
被捕获捕获,堆栈跟踪将打印到System.err
,您的方法会愉快地返回{ {1}}空toString()
,空StringBuilder
。调用该方法的代码不知道引发的异常,也无法处理异常。
替代品(尽管最好的完全取决于您的应用):
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
。