2014-03-31 137 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)

這將使用默認值初始化密鑰庫。
這應該足夠你的例子。