- 1、本文档共52页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章 异常、日志和断言
Java中,异常的捕获和处理是密不可分的两个操作。 * 栈是一种数据结构后 先进先出 FIFO, 栈轨迹是栈中数据的序列每个任务(进程)有一个栈,存放方法的调用等,在这个进程中每个函数被调用时分别从这个栈占用一段区域,称为帧(frame)。在异常中如果printStackTrace()则会输出 这个进程调用栈的内容。如 方法a调用方法b b调用c c调用d 如果执行a方法,当执行到d时抛出了异常则printStackTrace()则可以看到 一个栈信息 从栈顶到栈底打印出来,d c b a 的过程。 在运行期间可以通过throwable类来获取方法调用堆栈信息,例如哪个方法调用的当然方法,当前运行类的类名,文件名,代码行等等。??? Throwable ex = new Throwable();??? StackTraceElement[] stackElements = ex.getStackTrace();??? ??? if(stackElements != null)??? {??? ??? for(int i = 0; i stackElements.length; i++)??? ??? {??? ??? System.out.println(stackElements[i].getClassName());??? ??? System.out.println(stackElements[i].getFileName());??? ??? System.out.println(stackElements[i].getLineNumber());??? ??? System.out.println(stackElements[i].getMethodName());??? ??? System.out.println(-----------------------------------);??? ??? }??? } printStackTrace()方法所提供的信息可以通过getStackTrace()方法来直接访问,这个方法将返回一个由栈轨迹中的元素所构成的数组,其中每一个元素都表示栈中的一帧? 获取出现错误程序的文件名和程序中返回的代码行行号,该行号是指新建StackTrackElement对象的那一行*/ Java堆栈jvm为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存线程的状态。jvm对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。 某个线程正在执行的方法称为此线程的当前方法。当前方法使用的帧称为当前帧。当前方法所属的类称为当前类。当前类的常量池称为当前常量池。当线程执行一个方法时,它会跟踪当前的类和常量池。当jvm会在当前帧内执行帧内数据的操作。 当线程激活一个java方法,jvm就会在线程的java堆栈里新压入一个帧。这个帧自然成为了当前帧。在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据。 一个方法可以以两种方法结束。一种是正常返回结束。一种是通过异常抛出而异常结束(abrupt completion)。不管以那种方式返回,jvm都会将当前帧弹出堆栈然后释放掉,这样上一个方法的帧就成为当前帧了。堆栈上的所有数据都为此线程私有。一个线程不能访问另一个线程的堆栈数据,所以在多线程的情况下也不需要对堆栈数据的访问进行同步。象方法区和堆一样(见以前的译文),java堆栈和帧在内存中也不必是连续的。帧可以分布在连续的内存区,也可以不是。帧的数据结构由jvm的实现者来决定,他们可以允许用户指定java堆栈的初始大小或最大最小尺寸。 堆栈帧( The Stack Frame)堆栈帧有三部分:局部变量区,操作数堆栈和帧数据区。局部变量区和操作数堆栈的大小要视对应的方法而定。编译器在编译的时候就对每个方法进行了计算并放在了类文件(class file)中了。帧数据区的大小对一种jvm实现来说是一定的。当jvm激活一个方法时,它从类信息数据得到此方法的局部变量区和操作数堆栈的大小,并据此分配大小合适堆栈帧压入java堆栈中。 局部变量区java堆栈帧的局部变量区是一个基为零类型为word的数组。指令通过索引来使用这些数据。类型为int,float,reference和returnAddress的值在数组中占据一项,类型为byte,short,和char的值在存入数组前都转为了int值而占据一项。类型为long和double的值在数组中占据连续的两项,在访问他们的时候,指令提供第一项的索引。例如一个long值占据3,4项,指令会取索引为3的long值。局部变量区的所有值都是字对齐的,long和doubles
文档评论(0)