Почему я получаю сообщение «Исключение; должно быть обнаружено или объявлено выброшенным», когда я пытаюсь скомпилировать свой 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

2022-08-05T15:58:55+00:00
Вопросы с похожей тематикой, как у вопроса:

Почему я получаю сообщение «Исключение; должно быть обнаружено или объявлено выброшенным», когда я пытаюсь скомпилировать свой Java-код?