2010-10-28 66 views
4

我從Spring MVC的控制器寫我的異常處理程序,我有以下代碼:春3.0 MVC的ExceptionHandler

@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,堆棧跟蹤是空爲好。

有趣的是,在log4j記錄器中,我看到了兩個例外的完整堆棧跟蹤。 它爲什麼會這樣?

回答

3

就像情感說的那樣,null是消息。您只將消息附加到要顯示的模型,所以您將看不到堆棧跟蹤。

我的建議是計劃一個空指針是不值得的。 NPE是程序員的錯誤,如果提交給用戶,是一個缺陷或錯誤。

此外,根據您的代碼,您可以相同地處理和呈現所有異常,因此您可以擁有一個異常處理程序,該程序只處理ThrowableException。這也可以做到via the config, or even in your web.xml

1

「null」是您在NullPointer異常中獲得的消息。這只是Java。您沒有發佈任何試圖操縱堆棧跟蹤的代碼,或者任何使用log4j的代碼,所以無法真正說出爲什麼會有不一致的結果。

+0

是的。堆棧跟蹤和消息中有空。我知道向用戶展示NPE很醜陋,但我的目標是瞭解系統是如何工作的以及爲什麼我的行爲不一致。 – 2010-10-29 10:07:01

+0

我在說,你沒有發佈任何導致行爲不一致的代碼,那麼我們應該如何幫助你呢? – Affe 2010-10-29 17:19:34