对于java堆栈信息的打印,对于我们调试代码解决问题是非常有帮助的。java的异常机制会让我们很快的找到错误的位置。例如我的问题如下所示。
启动tomcat出现如下问题:
这只是堆栈中打印出问题的一小部分,还有很多的Exception,那是从哪一个Exception看起呢?而对于每个Exception打印的堆栈信息又是如何打印的?
对于Exception,会从底层到上层抛出,比如我的项目中用的是spirngMVC spring SpringJAP(在Dao层),如果Dao层出现错误,打印堆栈信息是从SpringMVC controller一直到底层Dao层。
而对于每个Exception打印,是从底层到高层。例如我的A、B、C、D类,四个类,分别A调用B,B调用C的方法,C调用D的方法,并且D抛出异常到C,C到B,B到A,依次类推,直到A捕获异常。代码如下所示:
D类
public class D { public void eat() throws Exception{ throw new Exception("这是D类的异常"); } }
public class C { public void eatD() throws Exception{ D d = new D(); d.eat(); } }
public class B { public void eatC() throws Exception{ C c = new C(); c.eatD(); } }
public class A { /** * @param args */ public static void main(String[] args) { B b = new B(); try { b.eatC(); } catch (Exception e) { e.printStackTrace(); } } }
这很明显,我们可以看到对于Exception来说,打印堆栈信息时从底层到高层的。
java中的异常我们是写在try....catch中的catch块去处理的,底层一般采用抛出异常的方式,这样在界面层就能捕捉到异常,如果我们在界面层也没有对异常进行处理,那么异常就会交给jvm来处理。我们也可以采用声明式异常来简化。
我们可以根据不同的异常分类,来确定转向到不同的页面,我们在web.xml中配置如下:
<error-page> <exception-type>java.lang.Throwable</exception-type> <location>/WEB-INF/views/error/500.jsp</location> </error-page> <error-page> <exception-type>java.lang.IllegalAccessException</exception-type> <location>/WEB-INF/views/error/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/WEB-INF/views/error/500.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/WEB-INF/views/error/404.jsp</location> </error-page>
能更好的利用工具和使用工具会提高我们的效率,好的习惯优于一切,学习的不是错误,学习的是别人解决问题的思路,素质和品质,改变吧。