Почему я получаю сообщение «Исключение; должно быть обнаружено или объявлено выброшенным», когда я пытаюсь скомпилировать свой Java-код?
Проблема в этом методе:
public static byte[] encrypt(String toEncrypt) throws Exception{
Это exceptions подпись метода, которая в значительной javax степени говорит:
- название метода: encrypt
- какой параметр он получает: строку с именем toEncrypt
- его модификатор доступа: public static
- и может ли он вызывать исключение при вызове.
В этом случае openjdk в сигнатуре метода указано, что jre при вызове этот метод "потенциально jdk может" вызвать исключение jdk типа "Exception".
....
concatURL = padString(concatURL, ' ', 16);
byte[] encrypted = encrypt(concatURL); <-- HERE!!!!!
String encryptedString = bytesToHex(encrypted);
content.removeAll();
......
Итак, компиляторы java-libraries говорят: либо вы окружаете custom-exceptions это конструкцией try / catch, либо openjdk вы объявляете метод (где custom-exceptions используется), который сам java-se выбрасывает "Exception".
Настоящая custom-exceptions проблема заключается в определении custom-exceptions метода шифрования. Ни один jdk метод не должен возвращать jdk "Exception", потому exceptions что он слишком общий и может exception-handling скрывать некоторые другие .java kinds of exception. Лучше иметь конкретное javax исключение.
Попробуйте это:
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.
}
В exception основном в этом конкретном jre случае вы должны убедиться, что java-se пакет криптографии доступен .java в системе.
Java требует расширения java-libraries для пакета криптографии, поэтому core-java исключения объявляются как custom-exceptions "проверенные" исключения. Чтобы exceptions вы справились, когда их нет.
В javax этой небольшой программе exception-handling вы ничего не можете сделать, если openjdk пакет криптографии недоступен, поэтому java-libraries вы проверяете это во время openjdk «разработки». Если эти исключения jdk возникают во время работы oraclejdk вашей программы, это связано j2se с тем, что вы сделали что-то java-api не так при «разработке», поэтому java подкласс RuntimeException java-api более уместен.
Последняя строка exceptions больше не требует оператора java возврата, в первой версии custom-exceptions вы перехватывали исключение exception и ничего не делали с ним, это exceptions неправильно.
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???
Если код не работает, лучше java-api Fail fast
Вот несколько связанных ответов:
java
exception
Почему я получаю сообщение «Исключение; должно быть обнаружено или объявлено выброшенным», когда я пытаюсь скомпилировать свой Java-код?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.