Которые заключены в блок try, catch, проблема в том, что в случае, если программа обнаружила исключение, вы ничего не возвращаете. Сформулируйте это так (измените в соответствии с логикой вашей программы):
Итак, компиляторы говорят: либо вы окружаете это конструкцией try / catch, либо вы объявляете метод (где используется), который сам создает "Exception".
Реальная проблема заключается в определении метода "encrypt". Ни один метод никогда не должен возвращать "Exception", потому что он слишком общий и может скрывать некоторые другие виды исключений, лучше иметь конкретное исключение.
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 thrownewIllegalStateException( 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 thrownewIllegalStateException( nsae ); } // line 109 won't say it needs a return anymore. }
В принципе, в этом конкретном случае вы должны убедиться, что пакет cryptography доступен в системе.
Java нуждается в расширении для пакета cryptography, поэтому исключения объявляются как "проверенные" исключения. Чтобы вы могли обрабатывать, когда их нет.
В этой небольшой программе вы ничего не сможете сделать, если пакет cryptography недоступен, поэтому вы проверяете это во время "разработки". Если эти исключения возникают при запуске вашей программы, это потому, что вы сделали что-то не так при "разработке", поэтому подкласс 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???
java.lang.Exception; должно быть перехвачено или объявлено выброшенным byte[] encrypted = зашифровать (объединить);
означает, что ваш encrypt метод выдает исключение, которое не обрабатывается или не объявляется actionPerformed методом, в котором вы его вызываете. Прочитайте все об этом в руководстве по Java Exceptions.
У вас есть несколько вариантов, из которых вы можете выбрать, чтобы заставить код скомпилироваться.
Вы можете удалить throws Exception из своего encrypt метода и фактически обработать исключение внутри encrypt.
Вы можете удалить блок try / catch из encrypt и добавить throws Exception и блок обработки исключений в свой actionPerformed метод.
Обычно лучше обрабатывать исключение на самом низком уровне, который вы можете, вместо того, чтобы передавать его на более высокий уровень.
Вторая ошибка просто означает, что вам нужно добавить оператор return к любому методу, который содержит строку 109 (также encrypt, в данном случае). В методе есть оператор return, но если генерируется исключение, оно может быть недоступно, поэтому вам нужно либо вернуться в блок catch, либо удалить try / catch из encrypt, как я упоминал ранее.
Ответ 4
Вам нужно решить, как вы хотели бы обрабатывать исключения, создаваемые методом encrypt.
В настоящее время encrypt объявляется с помощью throws Exception - однако в теле метода исключения перехватываются в блоке try / catch . Я рекомендую вам либо:
удалите throws Exception предложение из encrypt и обрабатывайте исключения внутренне (подумайте о написании, по крайней мере, сообщения журнала); или,
удалите блок try / catch из тела encrypt и вместо этого окружите вызов в encrypt с помощью try / catch (т. Е. в actionPerformed).
Что касается ошибки компиляции, на которую вы ссылаетесь: если исключение было сгенерировано в try блоке encrypt, после завершения работы catch блока ничего не возвращается. Вы могли бы решить эту проблему, изначально объявив возвращаемое значение как null:
Однако, если вы сможете исправить более серьезную проблему (стратегию обработки исключений), эта проблема решится сама собой - особенно если вы выберете второй вариант, который я предложил.