Spring 3.0 MVC 异常处理程序

4
我正在从Spring MVC控制器编写我的异常处理程序,我有以下代码:
@ExceptionHandler(NullPointerException.class)
      public ModelAndView handleMyException(NullPointerException  exception) {
    System.out.println(exception.getMessage());
        ModelAndView modelAndView = new ModelAndView("/errors/404");
        modelAndView.addObject("message", exception.getMessage());
           return modelAndView;
      } 

还有第二个:

@ExceptionHandler(ArithmeticException.class)
  public ModelAndView handleException(ArithmeticException exception) {
System.out.println(exception.getMessage());
    ModelAndView modelAndView = new ModelAndView("/errors/404");
    modelAndView.addObject("message", exception.getMessage());
       return modelAndView;
  }

现在我正在编写代码以抛出这些异常:
第一行抛出算术异常:
System.out.println(100/0);

它抛出正确的异常,并且exception.getMessage()返回消息“/ by zero”。

现在我正在尝试通过以下方式抛出第二个异常:

String test = null;
System.out.println(test.charAt(2));

出现了异常,但是exception.getMessage()返回null,堆栈跟踪也为null。

有趣的是,在log4j记录器中,我看到了两种异常的完整堆栈跟踪。为什么会这样呢?

2个回答

3

就像affe所说,null是消息。您只是将消息附加到要显示的模型上,因此您不会看到堆栈跟踪。

我的建议是不值得为null指针做计划。NPE是程序员错误,如果呈现给用户,则是缺陷或错误。

此外,根据您的代码,您以相同方式处理和呈现所有异常,因此您可以拥有一个异常处理程序,仅处理Throwable或Exception。这也可以通过配置或甚至在您的web.xml中完成。


1
"

"null"是在NullPointer异常时出现的消息。这只是Java的一部分。您没有发布任何试图操作堆栈跟踪或使用log4j的代码,因此无法确定为什么可能会产生不一致的结果。

"

是的,在堆栈跟踪和消息中都有null。我知道向用户显示NPE很丑陋,但我的目标是了解系统如何工作以及为什么会出现不一致的行为。 - danny.lesnik
我是说,你没有发布任何导致不一致行为的代码,那么我们应该如何帮助你呢? - Affe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接