首页 > 编程语言 >Java异常跟踪栈

Java异常跟踪栈

时间:2022-11-19 21:25:15浏览次数:63  
标签:调用 Java 方法 程序 跟踪 main 异常

Java异常跟踪栈

异常对象的printStackTrace()方法用于打印异常的跟踪栈信息,根据printStackTrace()方法的输出结果,我们可以找到异常的源头,并跟踪到异常一路触发的过程。

看下面用于测试printStackTrace的例子程序:

查看代码

上面程序中main方法调用firstMethod,firstMethod调用secondMethod,secondMethod调用thirdMethod,thirdMethod直接抛出一个SelfException异常。运行上面程序,会看到如图所示结果:

image

从图中可以看出,异常从thirdMethod方法开始触发,传到secondMethod方法,再传到firstMethod方法,最后传到main方法,在main方法终止,这个过程就是Java的异常跟踪栈。

在面向对象的编程中,大多数复杂操作都会被分解成一系列方法调用。这是因为:实现更好的可重用性,将每个可重用的代码单元定义成方法,将复杂任务逐渐分解为更易管理的小型子任务。由于一个大的业务功能需要由多个对象来共同实现,在最终编程模型中,很多对象将通过一系列方法调用来实现通信,执行任务。

所以,面向对象的应用程序运行时,经常会发生一系列方法调用,从而形成“方法调用栈”,异常的传播则相反:只要异常没有被完全捕获(包括异常没有被捕获,或异常被处理后重新抛出了新异常),异常从发生异常的方法逐渐向外传播,首先传给该方法的调用者,该方法调用者再次传给其调用者......直至最后传到main方法,如果main方法依然没有处理该异常,JVM会中止该程序,并打印异常的跟踪栈信息。

很多初学者一看到如图所示的异常提示信息,就会惊慌失措,其实图所示的异常跟踪栈信息非常清晰,它记录了应用程序中执行停止的各个点。

第一行的信息详细显示了异常的类型和异常的详细消息。

接下来跟踪栈记录程序中所有的异常发生点,各行显示被调用方法中执行的停止位置,并标明类、类中的方法名、与故障点对应的文件的行。一行行地往下看,跟踪栈总是最内部的被调用方法逐渐上传,直到最外部业务操作的起点,通常就是程序的入口main方法或Thread类的run方法(多线程的情形)。

下面例子程序示范了多线程程序中发生异常的情形:

查看代码

运行上面程序,会看到如图所示的运行结果:

image

从图中可以看出,程序在Thread的run方法中出现了ArithmeticException异常,这个异常的源头是ThreadExcetpionTest的secondMethod方法,位于ThreadExcetpionTest.java文件的某一行。这个异常传播到Thread类的run方法就会结束(如果该异常没有得到处理,将会导致该线程中止运行)。

前面已经讲过,调用Exception的printStackTrace()方法就是打印该异常的跟踪栈信息,也就会看到如上图所示的信息。当然,如果方法调用的层次很深,将会看到更加复杂的异常跟踪栈。

提示:虽然printStackTrace()方法可以很方便地用于追踪异常的发生情况,可以用它来调试程序,但在最后发布的程序中,应该避免使用它;而应该对捕获的异常进行适当的处理,而不是简单地将异常的跟踪栈信息打印出来。

标签:调用,Java,方法,程序,跟踪,main,异常
From: https://www.cnblogs.com/hzhiping/p/16907085.html

相关文章

  • Java异常处理规则
    Java异常处理规则前面介绍了使用异常处理的优势、便捷之处,本节将进一步从程序性能优化、结构优化的角度给出异常处理的一般规则。成功的异常处理应该实现如下4个目标:使......
  • Java使用throw抛出异常
    Java使用throw抛出异常当程序出现错误时,系统会自动抛出异常;除此之外,Java也允许程序自行抛出异常,自行抛出异常使用throw语句来完成(注意此处的throw没有后面的s,与前面声明抛......
  • 多数据源配置时validationQuery的问题(errorCode 923, state 42000 java.sql.SQLSynta
    起初,数据库配置为:datasource:master:url:jdbc:postgresql://ip:5432/databaseNameusername:**password:**......
  • java html串转换成文本串
    采用htmlparser来解决将html串中抽取出文本串。Stringstr="<!DOCTYPEHTMLPUBLIC\"-//W3C//DTDHTML4.0Transitional//EN\">"+"<HTML><HE......
  • java 序列化 浅克隆 深克隆
    序列化Java序列化技术可以使你将一个对象的状态写入一个Byte流里,并且可以从其它地方把该Byte流里的数据读出来,重新构造一个相同的对象。当两......
  • java与Access 数据库连接访问表 例子
    Java与数据库的连接对于一些中大型的主流数据库而言,一般数据库厂商都提供了专门的JDBC驱动.但对于部分小型数据库而言经常没有专门的JDBC数据库连接......
  • Java的内部类
    java内部类内部类的定义在一个类的内部再定义一个完整的类特点编译后可以生成独立的字节码文件内部类可以访问外部类的私有成员,而不破坏封装性可为外部类提供必要的......
  • java poi 读取.doc审阅 修订 最终状态 问题
    一、前景    在使用javapoi读取.doc文件,遇到审阅修订功能时,poi不能读取修定状态为“最终状态”的数据,而是读取了所有修定内容,如下图所示:文本读取内容:正确内......
  • 第4章SpringMVC核心技术2异常处理
    第4章SpringMVC核心技术2异常处理SpringMVC框架处理异常的常用方式:使用@ExceptionHandler注解处理异常。项目结构如下:2.1@ExceptionHandler注解使用注解@Exce......
  • Java新特性(2):Java 10以后
    您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~虽然到目前为止Java的版本更新还没有什么惊天动地的改变,但总是会冒出一些有趣的小玩意。前面列举了Java9和Java10的一些特......