【问题标题】:Syntax wrong with my SHA1 code我的 SHA1 代码语法错误
【发布时间】:2011-07-06 17:23:58
【问题描述】:

我得到以下代码:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


public class Sha1{

    private static final char[] HEX_CHARS = null;

    public static void main(String[] args){
        String hash = toSHA1(("27"+"peojvootv").getBytes());
        System.out.println(hash);
    }
    public static String toSHA1(byte[] convertme) {
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("SHA-1");
        }
        catch(NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        byte[] buf = md.digest(convertme);
        char[] chars = new char[2 * buf.length];
        for (int i = 0; i < buf.length; ++i) {
            chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
            chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
        }
        return new String(chars);
    }
}

不知何故,它发出了一个错误。我不知道如何解决它。这是调用栈

Exception in thread "main" java.lang.NullPointerException
    at mainClockies.Sha1.toSHA1(Sha1.java:26)//The return statement of second method
    at mainClockies.Sha1.main(Sha1.java:12)//The callback of the second method

【问题讨论】:

  • 不要吞下NoSuchAlgorithmException 异常。如果它被抛出,你一定会得到一个 NPE。最好将其包装在 RuntimeException 中并让它冒泡
  • 你的意思是用整个方法体包裹try{},然后包裹catch(Exception e){ e.printStackTrace();}

标签: java sha1


【解决方案1】:

好吧,如果MessageDigest.getInstance() 抛出NoSuchAlgorithmException,它发生 - 因为你打印出异常但不管怎样都继续。

然而,它实际上是因为这个而发生的:

private static final char[] HEX_CHARS = null;

然后是这个:

chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];

我怀疑您实际上并没有运行您面前的代码 - 至少在我的机器上,NPE 正确指向第 24 行,该行包括 HEX_CHARS。

修复:

private static final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();

【讨论】:

  • 好的,谢谢!我刚刚从stackoverflow.com/questions/4895523/java-string-to-sha1(最后一个示例)中获取代码并实现了它。我的 Eclipse 用 private static final char[] HEX_CHARS = null; 自动修复了 Hex-Chars 我用你的线替换了那条线。现在我收到了正确的结果。但我想知道这段代码是否最适合 SHA1 哈希函数?
  • @Woho87:没关系,据我所知——尽管你绝对应该对那个 catch 块做点什么。您可能应该抛出一个 RuntimeException。
  • 你的意思是用整个方法体包装try{}然后catch(Exception e){ e.printStackTrace();}
  • @Woho87: 不,我的意思是去掉当前代码中的e.printStackTrace(); 并用throw new RuntimeException(e); 替换它。吞下异常并假装它没有发生几乎是永远正确的方法。
【解决方案2】:

您的 HEX_CHARS 变量永远不会设置为 null 以外的任何值。

【讨论】:

    【解决方案3】:

    尝试在 HEX_CHARS 中添加 null 以外的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多