2014-03-31 94 views
1

这是我用于密钥库使用的代码。当我运行我的应用程序时,它显示密钥存储未初始化的异常。密钥库未初始化异常

    try { 
         KeyStore ks = KeyStore.getInstance("JKS"); 
         pk = ks.getKey("Alias", null); 
         if(pk != null){ 
          sendSMS("5556", Base64.encodeToString(pk.getEncoded(), Base64.DEFAULT)); 
         } 

        } 
        catch (KeyStoreException e) { 
         e.printStackTrace(); 
        } 
        catch(NoSuchAlgorithmException e){ 
         e.printStackTrace(); 
        } 
        catch (UnrecoverableKeyException e){ 
         e.printStackTrace(); 
        } 


      try { 
        ks.deleteEntry("Alias"); 
        ks.setKeyEntry("Alias", privateKey.getEncoded(), null); 
       } 
       catch (KeyStoreException e) { 
        e.printStackTrace(); 
       } 
       catch(NullPointerException e){ 
        e.printStackTrace(); 
       } 

回答

1

因为ks是在try块中声明的局部变量。这使得它在本地尝试本身,并且任何其他块都不可访问。

变化,

try { 
     KeyStore ks = KeyStore.getInstance("JKS"); 

要,

KeyStore ks; 
try { 
    ks = KeyStore.getInstance("JKS"); 

这将避免推ks超出范围时,你的第一个try块结束。

+0

我也试过了,但没有执行相同的错误。 – user3481084

+0

有没有其他的地方可以引用'ks'? – PopoFibo

+0

不仅仅是上面提到的块。 – user3481084

2

您使用变量'ks'超出范围。线

ks.deleteEntry("Alias"); 
ks.setKeyEntry("Alias", privateKey.getEncoded(), null); 

需要在同一try{块作为KeyStore ks = KeyStore.getInstance("JKS");

还需要初始化密钥库,通过使用load(..)方法:http://developer.android.com/reference/java/security/KeyStore.html#load(java.io.InputStream,CHAR [])

使用您的示例代码,这将是:

try { 
    KeyStore ks = KeyStore.getInstance("JKS"); 
    ks.load(null, null); 
    pk = ks.getKey("Alias", null); 
    if(pk != null){ 
     sendSMS("5556", Base64.encodeToString(pk.getEncoded(), Base64.DEFAULT)); 
    } 
    ks.deleteEntry("Alias"); 
    ks.setKeyEntry("Alias", privateKey.getEncoded(), null); 
} 
catch (KeyStoreException e) { 
    e.printStackTrace(); 
} 
catch(NoSuchAlgorithmException e){ 
    e.printStackTrace(); 
} 
catch (UnrecoverableKeyException e){ 
    e.printStackTrace(); 
} 
+0

我已经完成了你所说的但没有工作 – user3481084

+0

什么是错误? – Erik

+0

与我上面说的相同:keystore未初始化 – user3481084

0

尝试: ks.load(null)

这将使用默认值初始化密钥库。
这应该足够你的例子。