我有这个简单的代码,有一段时间了。基本上我正在尝试获取密钥库实例,以便我可以使用它来启用ssl。 我现在的问题是我在下面得到空指针异常,似乎无法在任何地方找到解决方案。 我在ubuntu 15.04 32位上使用openjdk 8。
//Do other initializations things
...
KeyStore ks = KeyStore.getInstance("PKCS12");
KeyStore ts = KeyStore.getInstance("PKCS12");
char[] keymanagerPassPhrase = keymanagerPassPhraseString.toCharArray();
char[] keystorePassPhrase = keystorePassPhraseString.toCharArray();
char[] truststorePassPhrase = truststorePassPhraseString.toCharArray();
ks.load(new FileInputStream(keystoreFile), keystorePassPhrase);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, keymanagerPassPhrase);
TrustManager[] trustManagers = null;
if( useCustomTrustStore ) {
ts.load(new FileInputStream(truststoreFile), truststorePassPhrase);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ts);
trustManagers = tmf.getTrustManagers();
}
SSLContext sslContext = SSLContext.getInstance(protocal);
sslContext.init(kmf.getKeyManagers(), trustManagers , null);
return sslContext.createSSLEngine();
抛出的异常是:
Caused by: java.lang.NullPointerException
at java.security.Provider$ServiceKey.<init>(Provider.java:872)
at java.security.Provider$ServiceKey.<init>(Provider.java:865)
at java.security.Provider.getService(Provider.java:1039)
at sun.security.jca.ProviderList.getService(ProviderList.java:332)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:157)
at java.security.Security.getImpl(Security.java:695)
at java.security.KeyStore.getInstance(KeyStore.java:848)
我该怎么办?
答案 0 :(得分:1)
这个问题有点老了但是谷歌的问题接近顶部,所以我会尽力帮忙。
要在Java的代码库中调试NPE,您只需确保在IDE中使用Java源代码;然后你可以检查什么是null的提示。你似乎在使用JDK 8,所以就是这一行:
algorithm = algorithm.toUpperCase(ENGLISH);
另外,ServiceKey init方法(构造函数)中没有任何其他内容可能导致NPE。那么...... String algorithm
参数来自哪里,传递给这个构造函数?
看起来它只是通过了所有这些层;请参阅at java.security.Security.getImpl(Security.java:695)
- 算法是第一个在那里传递的参数。
再打开一个:at java.security.KeyStore.getInstance(KeyStore.java:848)
- 您在这里传递的参数称为“类型”,但这就是Security.getImpl
传递给algorithm
的内容。
因此,当您调用type
时,错误是您为KeyStore.getInstance()
参数传递了null。这似乎与您列出的源代码不符,因此您可能没有正确编译代码。添加“健全性检查” - 例如,代码中的println;并查看您的代码中的哪个行号在堆栈跟踪的下方显示。