2013-05-17 66 views
0

我已經導入以下到我的項目麻煩與javax.crypto.Cipher中

import java.security.*; 
import javax.crypto.*; 
import javax.crypto.spec.*; 
import java.io.*; 

以下是告訴我 「未處理的異常類型NoSuchPaddingException」

Cipher c = Cipher.getInstance("AES"); 

我使用JaveSE-1.6 。

任何想法會造成這種情況?

+2

你需要拋出異常。 – Smit

+1

既然你沒有指定填充,你會得到默認的填充,在這種情況下,這個例外應該是不可能的。對我來說,這表明你真的搞砸了加密配置的一部分,或者你的類路徑是錯誤的,或者你已經在某處安裝了一個bug提供程序。運行此代碼的Java 1.6不會拋出該異常。 –

回答

5

Cipher.getInstance(...)引發兩種異常,並要求您處理它們。

要麼含有Cipher c = Cipher.getInstance("AES");重新拋出異常的方法,如果你想在其他地方處理:

public void foo(){ throws Exception ... }

或者更好的是,封閉的方法,在try-catch塊:

try{ 
    Cipher c = Cipher.getInstance("AES"); 
} 
catch(Exception e){ 
    //do something about it 
} 

你也可以找到發燒友,並做到這一點:

try{ 
    Cipher c = Cipher.getInstance("AES"); 
} 
catch(NoSuchAlgorithmException e){ 
    //handle the case of having no matching algorithm 
} 
catch(NoSuchPaddingException e){ 
    //handle the case of a padding problem 
} 

某些Java方法會拋出異常,其中一些需要您處理它們。在該方法需要處理後,Java API文檔中的任何內容均爲Throws。一般來說,他們讓你這樣做是有原因的。在這種情況下,如果您無法獲得正確的密碼,則無法加密任何內容。

+0

謝謝。這就是訣竅! –

+0

樂於幫助。如果您覺得這個問題已完成,請隨時將此問題標記爲已回答。 –

+0

引發此異常的原因是編譯器不檢查字符串的內容。如果這樣做,那麼它將能夠確定該字符串是有效的,而不是拋出異常。如果API有辦法做到這一點會更好,這當然是可能的。現在我們仍然堅持處理GeneralSecurityExceptions。 –