Проблема в этом методе:
public static byte[] encrypt(String toEncrypt) throws Exception{
Это сигнатура метода , которая в значительной степени говорит:
- как называется метод: encrypt
- какой параметр он получает: строка с именем toEncrypt
- его модификатор доступа: public static
- и может или нет выбросить исключение при вызове.
В этом случае подпись метода говорит, что при вызове этот метод «мог» потенциально вызвать исключение типа «Исключение».
....
concatURL = padString(concatURL, ' ', 16);
byte[] encrypted = encrypt(concatURL); <-- HERE!!!!!
String encryptedString = bytesToHex(encrypted);
content.removeAll();
......
Таким образом, компиляторы говорят: либо вы окружаете это конструкцией try / catch, либо объявляете метод (где он используется) для выдачи «Exception» самостоятельно.
Настоящая проблема - определение метода «шифровать». Ни один метод не должен возвращать «Exception», потому что он слишком универсальный и может скрывать некоторые другие виды исключений лучше иметь конкретное исключение.
Попробуйте это:
public static byte[] encrypt(String toEncrypt) {
try{
String plaintext = toEncrypt;
String key = "01234567890abcde";
String iv = "fedcba9876543210";
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE,keyspec,ivspec);
byte[] encrypted = cipher.doFinal(toEncrypt.getBytes());
return encrypted;
} catch ( NoSuchAlgorithmException nsae ) {
// What can you do if the algorithm doesn't exists??
// this usually won't happen because you would test
// your code before shipping.
// So in this case is ok to transform to another kind
throw new IllegalStateException( nsae );
} catch ( NoSuchPaddingException nspe ) {
// What can you do when there is no such padding ( whatever that means ) ??
// I guess not much, in either case you won't be able to encrypt the given string
throw new IllegalStateException( nsae );
}
// line 109 won't say it needs a return anymore.
}
По сути, в этом конкретном случае вы должны убедиться, что пакет криптографии доступен в системе.
Java требуется расширение для пакета криптографии, поэтому исключения объявляются как «проверенные» исключения. Для вас справиться, когда их нет.
В этой небольшой программе вы ничего не можете сделать, если пакет криптографии недоступен, поэтому вы проверяете это во время «разработки». Если эти исключения генерируются во время работы вашей программы, это потому, что вы что-то сделали неправильно в «разработке», то подкласс RuntimeException является более подходящим.
Последняя строка больше не нуждается в выражении return, в первой версии вы перехватывали исключение и ничего не делали с ним, это неправильно.
try {
// risky code ...
} catch( Exception e ) {
// a bomb has just exploited
// you should NOT ignore it
}
// The code continues here, but what should it do???
Если код не работает, лучше Fail fast
Вот несколько похожих ответов: