Я реализовал обработку исключений в своих веб-приложениях Spring, используя как подход AOP, так и метод @ControllerAdvice, и до сих пор не имел с ними проблем.
Теперь я реализую автономное настольное приложение Swing с использованием Spring Framework, а также пытаюсь обработать исключения, но у меня не получалось заставить его работать.
Чтобы сократить детали, я сделал простой проект;
Launcher.java;
public class Launcher {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
ApplicationContext context = null;
try {
context = new AnnotationConfigApplicationContext(Config.class);
MainFrame mainFrame = (MainFrame) context.getBean("mainFrame");
mainFrame.init();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (context != null)
((ConfigurableApplicationContext) context).close();
}
}
});
}
}
Config.java;
@Configuration
@ComponentScan("main")
public class Config {
@Bean(name = "mainFrame")
public MainFrame createMainFrame() {
return new MainFrame();
}
}
GlobalControllerAdvice.java;
@ControllerAdvice
public class GlobalControllerAdvice {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public void handleException(Exception ex) {
System.out.println("hey");
}
}
MainFrame.java
public class MainFrame extends JFrame {
public MainFrame() {
this.setSize(500, 500);
}
public void init() {
setVisible(true);
int[] a = null;
System.out.println(a.length);
}
}
Итак, здесь, в моем методе init (), при попытке распечатать длину массива «null» возникает исключение NullPointerException, которое я пытаюсь перехватить в моем ControllerAdvice, но оно не работает.
Может кто-нибудь, пожалуйста, помогите мне понять, что мне здесь не хватает? Или что может быть лучшим способом обработки моих исключений?
Обновлено: Когда я запускаю Launcher, появляется рамка и выдается NPE;
java.lang.NullPointerException
at main.MainFrame.init(MainFrame.java:14)
at main.Launcher$1.run(Launcher.java:19)
Но System.out.println ("эй"); в моем методе GlobalControllerAdvice не распечатывается, поэтому я предполагаю, что мой класс не знает о сгенерированном исключении.
вы пробовали: попробовать-поймать? вы пытаетесь обработать NPE в своем ControllerAdvice, но как вы связываете свой ControllerAdvice с кодом, генерирующим NPE? обычно не существует универсального способа обработки NPE, и вы хотите обрабатывать каждый случай определенным образом, так почему вы даже пытаетесь сделать что-то подобное?
@GhostCat «не работает» означает, что мое приложение выдает NPE, но мой ControllerAdvice его не получает.
@Stultuske Потому что я хочу регистрировать каждое исключение, возникающее в моем приложении, и я действительно не хочу обрабатывать это во всех моих разных классах.
Но что вы имеете в виду: фрейм не отображается, и все приложение вылетает, а просто выводит трассировку стека? Опять же: дайте минимальный воспроизводимый пример, который содержит такие детали. Также обновите вопрос, вместо того, чтобы помещать больше информации в комментарии, пожалуйста!
@ozgen еще раз: вы никогда не связываете свой метод с советом. как вы ожидаете, что это сработает?
@Stultuske Хорошо, в этом есть смысл. Тогда как мне привязать свой метод к совету?
Вы используете Spring в своем настольном приложении только для обработки исключений? Это кажется довольно неестественным, поскольку spring в основном предназначен для серверных (веб-) приложений.




Что значит "не работает"? Пожалуйста, четко опишите, что вы ожидаете, и что происходит на самом деле.