(计算机应用技术专业论文)java语言的异常处理机制的公理语义.pdf_第1页
(计算机应用技术专业论文)java语言的异常处理机制的公理语义.pdf_第2页
(计算机应用技术专业论文)java语言的异常处理机制的公理语义.pdf_第3页
(计算机应用技术专业论文)java语言的异常处理机制的公理语义.pdf_第4页
(计算机应用技术专业论文)java语言的异常处理机制的公理语义.pdf_第5页
已阅读5页,还剩65页未读 继续免费阅读

(计算机应用技术专业论文)java语言的异常处理机制的公理语义.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 本文以j a v a 语言为背景,讨论异常处理机制的公理语义。主要工作包含四部分: ( 1 ) 详细地讨论了t h r o w 语句和t r y 语句的公理语义。 ( 2 ) 给出了与异常处理机制密切相关的运算符n e w 和c o n t i n u e ,b r e a k ,r e t u r n 等语 句的公理语义。 ( 3 ) 为了说明本文提出的公理语义方案具有一般性,也给出了具有异常处理机制条件 下,i f 语句,w h il e 语句,和块等语句的公理语义。 ( 4 ) 最后给出一个具有异常处理功能的程序片段的正确性证明的实例。 关于公理语义,目前没有见到讨论c o n t i n u e ,b r e a k ,r e t u r n 等的语句的公理化方 面的文章,主要原因是这些语句涉及到控制转移问题,用逻辑公式不易描述。 对于异常处理机制来说,其公理语义的研究难度更大。因为,异常处理机制涉及到 更大范围的控制转移,这种转移可能是跨函数或者跨文件的。根据j a v a 异常处理机制 的语义,一旦发生异常,在查找处理该异常的过程中,可能会终止一连串的方法调用。 为了描述控制转移,引入一个变量r e a s o n ,它记录每个语句执行结束后,该语句的执 行状态。根据这个状态,决定控制的走向。因此,在每个语句,表达式的公理中的条件 部分和结论部分都含有r g a s o n 。条件部分的r e a s o n 决定程序下步执行所选择的公理; 而结论部分的r e a s o n ,用来决定程序下一步执行的条件,从而解决了用公理语义的方 法描述的更大范围的控制转移问题。 关键字:j a v a 异常处理机制。j a v a 语言,公理化,程序验证 a b s t r a c t i nt h i st h e s i sa x i o m a t i cs e m a n t i c so fj a v ae x c e p t i o nh a n d l i n gm e c h a n i s mi s i n t r o d u c e d t h ec o n t e n do fp a p e ri sd i v i d e di n t of o u rp a r t s : ( i ,o i s o u s st h ea x i o m a t i cs e m a n t i c so ft h r o wa n dt r ys t a t e m e n t ( 2 ) g i v et h ea x i o m a t i cs e m a n t i c so ft h eo p e r a t o r 一- n e wa n dc o n t i n u e b r e a ka n d r e t u r ns t a t e m e n t ,w h i c ha r ec o n c e r n i n ga b o u tt h ee x c e p t i o n h a n d l i n g ( 3 ) w ea l s og i v et h ea x i o m a t i cs e m a n t i c so fi fs t a t e m e n ta n dw h i l es t a t e m e n ta n d b l o c ks t a t e m e n ti no r d e rt os h o wt h a tt h ea x i o m a t i cs e m a n t i c sp l a ni sn o r m a l ( 4 ) a tl a s t ,w eg i v ea ne x a m p l eo ft h ec o r r e c t n e s so fc o d es l i c e 。w h i c hh a st h e e x c e p t i o nh a n d li n g a b o u tt h ea x i o m a t i cs e m a n t i c s ih a v en o ts e et h ea r t i c l e sa b o u tt h e a x i o m a t i cs e m a n t i o so fc o n t i n u e ,b r e a k ,r e t u r n ,a n dt h em a i nr e a s o ni st h e s e s t a t e m e n t sc o n c e r n i n ga b o u tt h ec o n t r o lt r a n s f e ra n dd i f f i c u l t l vt od e s c r i b e t h ef o r m u l a i ot h ee x c e p t i o nh a n d l i n gm e c h a n i s m ,t h ea x i o m a t i cs e m a n t i c si sd i f f i c u l t l y t or e s e a r c h t h ee x c e p t i o nh a n d l i n gm e c h a n i s mc o n c e r n i n gl a r g e s c a l ec o n t r o l t r a n s f e r s ot h et r a n s f e ri sp r o b a b l yb e t w e e nt h ef u n c t i o n so rf i l e s w h e nt h e e x c e p t i o n sh a p p e n ,i nt h ep r o c e s so fh a n d l i n gt h ee x c e p t i o n ,as e r i e so ff u n c t i o n c a l l i n gw i l lt e r m i n a t e t ot h ec o n t r o lt r a n s f e r ,av a r i a b l er e a s o ni si n t r o d u c e d , w h i c hi sr e c o r d e de v e r ys t a t eo fs t a t e m e n te x e c u t i o n t h es t a t e sd e c i d et h e c o n t r 0 1t r a n s f e r s o i ne v e r ys t a t e m e n t ,t h ec o n d i t i o no rc o n c l u s i o no ft h e d x i o m a t i cs e m a n t i c so fe x p r e s s i o nh a st h e “r e a s o n ”t h ec o n d ic i o no ft h e r e a s o nd e c i d et h ea x i o md e c i d et h en e x ts t e po ft h ep r o g r a mr u n n i n g o e s c r i b i o g t h es t a t eo fe v e r yp o i n to fc o d ea n da d d i n gs o m er u l e r ,w ec a ng e tt h ec o r r e c t n e s s o fc h ep r o g r a m u s i n gt h ea x i o m a t i cs e m a n t i c sw es o l v et h ep r o b l e mt h a td e s c r i b e t h el a r g e s c a l ec o n t r o lt r a n s f e r k e y w o r d :e x c e p t i o nh a n d ii n gm e c h a n i s mo fj a v a ,j a v ap r o g r a m m i n gi a n g u a g e a x i o m a t i cs e m a n t i c s p r o g r a mv e r i f i c a t i o n j a v a 语言的异常处理机制的公理语义 o 前言 0 1 采用异常处理机制的必要性 在程序开发中,程序员在编写程序时发生错误时在所难免的。对于包含错误的程序, 我们该如何做使其纠正这些错误,使其正确? 这些错误是如何被处理的? 谁处理的? 程 序可以被正确的恢复吗? 或就是简单的让它中止? 要解决这些问题,以往在面向过程程序设计语言中,利用返回值,做一个简单的判 断,再给出相应的处理,这个方法在简单情况下,小系统中能给出一个较好的解决。但 在大型软件开发中,往往用这种方法实现起来很难,甚至是根本难以实现,并会人为的 使程序代码复杂化。丽大型软件开发本身就是一个难题,面向对象技术在一定程度上降 低了其开发难度,更重要的是它实现了异常处理机制。 由程序语言提供的异常处理机制简化了开发强壮的软件系统的难度。使用这些机制, 软件开发者可以描述在一个模块中异常的发生条件,在模块执行中出现异常,在出现的 那一时刻就会被处理。异常的处理机制,在其中起着举足轻重的作用。异常处理机制已 经不仅仅被当作汇报错误的一种机制,在程序员开发实践中,也被用来作为处理程序非 正状态一种处理机制。 从局部的观点看,要生成一个强壮的系统,开发者必须分析清楚模块中异常的流程。 在面向对象语言中,使用未经检查的异常,使得软件开发者难于对其进行针对性的处理。 特别的,j a v a 语言结构的异常流程( f l o wo fe x c e p t i o n ) 使得用户可以加入自己设想的 对异常的处理。 为了简化了开发强壮的软件系统的难度,很多现代的程序语言都有一个异常处理机制。 这些机制主要是;在一个程序点,通过某种手段明确产生异常的情况和另外一些手段提 供一组代码去处理异常情况。在本质上,这些机制提供给软件开发者一种方法,把处理 异常情况的代码与那些处理一般情况的代码分离,这有助于软件开发者从逻辑上和结构 上组织代码。 很多情况下,仅从局部是无法分析清楚一个错误的产生原因的。一些简单的应用中,可 以在异常发生的时刻,产生异常信息并终止程序的运行。在另一些应用中,则更希望或 者能恢复异常,或为终止程序提供一些有用的信息。所以,异常处理机寿l 应运面生,并 较好的解决了这些问题。 j a v a 语言使用异常来提供针对其程序的错误处理能力。异常就是一个再程序正常运行状 态下发生的事件。如果,你编写过j a v a 程序,那你一定会遇到异常。你第一次遇到的j a v a 程序的异常从编译器带来的错误信息也许是这样的: i n p u t f i l e j a v a :1 l :e x c e p t i o nj a v a i o f i l e n o t f o u n d e x c e p t i o nm u s tb ec a u g h t ,o r i tm u s tb ed e c l a r e di nt h et h r o w sc l a u s e o ft h i sm e t h o d i n = n e wf il e r e a d e r ( f il e n a m e ) : 这些信息暗示编译器发现一个未被处理的异常。j a v a 语言要求一个方法要么捕获所有检 1 j a v a 语言的异常处理机制的公理语义 查异常( 能被运行时系统检测到的异常) 或者指定那种可以被抛出的异常。 然而,j a v a 异常机制本身,是否正确,是否存在可以进一步优化和改进的地方? 这些问 题的回答,依赖于给否出证明,否则这些程序的正确性无法得到保证。所以只有给出异 常机制的正确性,才能使得程序的正确性得以保证。因此,异常机制的正确性是极为必 要的和重要的。 o 2 以往研究进展 以往对这类问题的处理如下: 一种面向过程的语言中,所谓的异常是可以在程序中的任何位置被声明的值。声明 后,这些值能被使用。因为很难让程序员相信,所有异常都被捕捉到,一些静态分析程 序被开发以跟踪机器语言中未被处理的异常。 另外,些语言中,在一些方法中声明可以引发的异常类型。如果没有声明异常,则 默认可以抛出所有类型的异常。所有未声明的异常都被映射成立个特定的异常。如果 缺少异常处理函数,不给出提示。与之比较,j a v a 语言中,抛出异常的那部分中处理异 常,或转发异常。j a v a 还提供未经检查的异常作为检查异常的补充。异常处理机制,允 许用户制定处理异常的方式,这不同于传统的基于控制和数据流的分析。 以往针对面向过程程序化设计语言的形式化已经做的很多。在h o a r e 公理系统的基 础上,给出了p a s c a l 语言的分程序的公理语义和过程的公理语义以及联立予程序的公理 语义,并在此基础上给出了p a s c a l 语言的公理语义【l 】。但j a v a 语言是面向对象语言, 其实现异常机制也是建立在面向对象的基础之上,想要描述j a v a 异常机制,必须先描述 类,然后再描述异常处理机制。 而对面向对象的描述中,早期的p a s c a l 语言中给出了基于类的形式化,但只给出了 类程的公理语义【1 】,类程的一般形式如下: c l a s st : b e g i n c 。,c :,c 。诸变量的说明 p r o c e d u r ep i :q : p r o c e d u r ep , :q ,: p r o c e d u r ep 。 :e ,。 q e n d : 其中p 是过程名,q ;是相应的过程体,这些过程作用于诸变量c j 之上,0 是初启程序, n n 于n n c 赋值。可以在过程前加上类型说明,此时过程成为函数。t 是类程名。 在说明了类程之后,可以用它来说明变量,此处我们采用了p a s c a l 的形式: 一2 一 一 ! ! 兰塑墨塑墨堂竺竺! ! 型塑竺堡堡墨 v a r t 1 ,t2 ,t k :t : 抽象数据类型的一个特点是,把对数据麓行的操作和数据本身约束在一起了,因此,对 诸t i 可施行的操作只能是那些p i 。为了区别,把t 。和p i 结合在一起形成过程调用,即 t ,p i 表示调用的过程属于t i ,它也可以是函数调用,此时写成: x := t 。只 然后在此基础上,针对j a v a 语言的形式化做的很少。p e t e rb e r t e l s e n 采用指称语 义给出了j a v a 语言子集的形式化 3 1 ,其对于类型安全的证明是通过i s a b e l l e h o l 。但 仍没有全部完成,仍在继续。这是t e c h n i c a lu n i v e r s i t yo fd e n m a r k 的两个副教授h a n s b r u u n 和p e t e rs e s t o f t 的一个研究项目。他们主要研究了j a v ab y t ec o d e 的语义,和 j a v a 虚拟机,以及t h ej a v av i r t u a lm a c h i n es p e c i f i c a t i o n ( p u b l i s h e d b y h d d i s o n w e s l e yo nb e h a fo fs u nm i c r o s y s t m e s ,i n c ) 。 特别是区别与以往面向过程的程序设计语言的形式化做的很少,而对j a v a 语言中异 常处理机制的形式化描述就更少。因而,这种异常处理机制的正确性和其是否有可优化 的地方就没能给出形式化的证明。 0 3 本文所解决的问题 本文在系统总结和学习前人在面向过程程序语言形式化描述的成果的基础上,对于 以往,没能很好的解决r e t u r n 等语句的形式化的问题,以往对程序语言的形式化都没能 很好的解决这个问题。本文给出了i f ,r e t u r n ,b r e a k ,c o n t i n u e 等语句的公理语义描 述。 面对当今程序程序开发普遍采用面向对象语言的现状,进而深入的学习了j a v a 语言 的语义,进而更加深入的了解面向对象程序设计语言。并且,把面向对象程序设计语言 与以往的面向过程程序语言相比较,找到两者的不同。 并在此基础上,学习已有的对面向过程程序语言的形式化描述的基础上,总结了j a v a 语言这门面向对象的程序设计语言的语义与向过程程序语言不同的部分。并进而,在此 基础上给出了j a v a 异常处理机制公理语义。因为在j a v a 语言中,异常处理这个问题是 无法克服的,这就使得,采用面向对象技术,特别是,j a v a 语言实现的程序的正确性的 证明消除了障碍。 并且,进而给出j a v a 语言异常处理机制的改进方案。 j a v a 语言的异常处理机制的公理语义 1 j a v a 语言的语义 1 1 语句的语义 本节主要介绍j a v a 语言语句的语义。为此首先介绍语句的正常完成和突然完成的概 念,以及语句的正常执行模型。通过语句正常执行模型,介绍不同类型的语句的语义。 1 1 1 语句的正常完成和突然完成 每个语句都有一个正常的执行模型,这个模型由若干计算步骤构成。如果一个语句 的所有计算步骤都正常完成,则说这个语句正常完成。 如果语句的执行,由于某种原因停止在某个计算步骤上,那么后续的计算步骤就不再 计算,这条语句被称作因为同样的原因突然完成。一些事件的发生可以阻止一个语句的正 常完成。 例如在计算一个表达式语句发现被零除,则这条表达式语句的执行因被零除突然完 成。 语句的突然完成只有如下几种情况: 没有l a b e l 的b r e a k 语句b r e a kw i t hn ol a b e l 有l a b e l 的b r e a k 语句 b r e a kw i t hl a b e li d 没有l a b e l 的c o n t i n u e 语句c o n t i n u ew i t hn o l a b e l 有l a b e l 的e o n t i n u e 语句 c o n t i n u ew i t hl a b e l 没有值的r e t u r n 语句 r e t u r nw i t hn ov a l u e 有值的r e t u r n 语句 r e t u r nw i t hg i v e nv a l u e 带有给定值的t h r o w 语句,包括j a v a 虚拟机抛出的异常。t h r o w w i t hag i v e nv a l u e 在表达式计算中也存在正常完成和突然完成。一个表达式突然完成的唯一原因是抛出 一个异常,因为要么一个带有给定值的t h r o w 语句或者一个运行时异常或者一个错误。 一个语句计算一个表达式,表达式的突然完成总是引起语句的突然完成( 同样原因) 。 正常执行中的后续步骤就不再被执行。 除非特别指出,一个语句正常完成的条件是: ( 1 ) 所计算的所有表达式正常完成。 ( 2 ) 所包含的所有子语句的执行正常完成。 1 1 2 语句块和一般语句 1 1 2 1 语句块 语句块是语句序列,在语句块的大括号中可以包含局部类声明和局部变量声明。 b 1 0 c k : ( s 1s 2 s n 其中s i 是语句,i = l n 一个语句块的执行过程是依次执行各个语句。如果块中的所有语句正常完成,那么这 4 j a v a 语言的异常处理机制的公理语义 个语句块就正常完成。如果语句块中的任何语句由于某种原因突然完成,那么这个语句 块因同样的原因突然完成。 1 1 2 2 空语句 空语句不作任何事情 e m p t y s t a t e m e n t : 空语句的执行总能正常完成。 1 1 2 3 标号语句 带标号语句语法: i d e n t i f i e r : s t a t e m e n t ; 标示符i d e n t i f i e r 是其直接包含语句s t a t e m e n 的标号。标号的作用域是冒号后面 的第一个语句。 1 1 2 4 表达式语句 表达式语句的语法:e x p r e s s i o n ; 其中e x p r e s s i o n ,只能是如下表达式之一: ( 1 ) 赋值表达式 ( 2 ) 前增表达式 ( 3 ) 前减表达式 ( 4 ) 后增表达式 ( 5 ) 后减表达式 ( 6 ) 方法引用表达式 ( 7 ) 类实例创建表达式 表达式语句的执行就是计算表达式。如果表达式有值,把值抛弃。表达式语句的正 常完成的充分必要条件是表达式的计算正常完成。 1 1 3 条件语句 i f 语句语句的语法: ( 1 ) i f ( b ) s 1 ( 2 ) i f( b ) s 1e l s es 2 其中b 是布尔表达式; s l ,s 2 是语句。i i f 语句( 1 ) 的执行过程是: 首先要计算表达式b 。 如果表达式的计算由于某种原因突然完成,i f 语句因为同样的原因突然完成。 否则,如果b 的值为真,执行语句s l 如果s 1 正常完成,i f 语句正常完成。 如果s 1 因为某种原因突然完成,i f 语句因为同样的原因突然完成。 j a v a 语言的异常处理机制的公理语义 如果b 的值为假,i f 语句正常完成。 i f 语句( 2 ) 的执行过程是: 首先要计算表达式b 。 如果表达式的计算由于某种原因突然完成,i f 语句因为同样的原因突然完成。 否则,如果b 的值为真,执行语句s 1 如果s 1 正常完成,i f 语句正常完成。 如果s 1 因为某种原因突然完成,i f 语句因为同样的原因突然完成。 如果b 的值为假,执行语句s 2 如果s 2 正常完成,i f 语句正常完成。 如果s 2 因为某种原因突然完成,i f 语句n n n 样的原因突然完成。 1 1 4 控制转移语句 1 1 4 1b r e a k 语句 b r e a k 语句的语法: ( 1 ) b r e a k ;该语句必须出现在s w i t c h ,w h i l e ,d o ,f o r 语句中。 ( 2 ) b r e a ki d e n t i f i e r :该语句不必出现在s w i t c h ,w h i l e ,d o ,f o r 语句中。 b r e a k 语句的执行过程: b r e a k 语句( 1 ) 终止包含该语句的最内层的s w i t c b 或循环语句。b r e a k 语句总 因”b r e a kw i t hn ol a b e l ”突然完成,但包含它的s w i t c h 或循环语句总正常完 成。 b r e a k 语句( 2 ) 终止带标号i d 的b r e a k 语句的执行,b r e a ki d 总因“b r e a kw i t h l a b e li d ”突然完成,并且引起带标号i d 的语句立即正常完成。 1 1 4 2c o n t i n u e 语句 c o n t i n u e 语句的语法: ( 1 ) c o n t i n u e : ( 2 ) c o n t i n u ei d e n t i f i e r : 两种c o n t i n u e 语句都必须出现在循环语句中。 c o n t i n u e 语句的执行过程: ( 1 ) 不带标号的c o n t i n u e 语句试图终止包含该c o n t i n u e 语句的最内层的f o r ,w h i l e d o 的本次迭带,并开始下一次迭带。c o n t i n u e 总是因为”c o n t i n u ew i t h n o l a b e l ”而突然完成。 ( 2 ) 带标号的c o n t i n u ei d e n t i f i e r 语句试图终止带标号i d e n t i f i e r 的f o r ,w h i l e , d o 语句的本次迭带,并立即开始下一次迭带,c o n t i n u ei d e n t i f i e r 语句总 因”c o n t i n u ew i t hl a b e li d e n t i f i e r ”而突然完成。 1 1 4 3r e t u r n 语句 6 j a v a 语言的异常处理机制的公理语义 r e t u r n 语句的语法: ( 1 ) r e t u r n : ( 2 ) r e t u r ne x p ; r e t u r n 语句的执行: ( 1 ) r e t u r n :试图传递控制权给引用者,语句总因“r e t u r nw i t hn ov a l u e ”,而 突然完成。 ( 2 ) r e t u r ne x p :语句首先计算e x p ,如果计算e x p 由于某种原因突然完成,则 r e t u r n 语句由于同样原因突然完成,否则得到e x p 的值v ,那么整个r e t u r n 语 句因为“r e t u r nw i t hv a l u ev ”而突然终止。 1 1 5 异常处理语句 1 1 5 1t h r o w 语句 t h r o w 语句能引起一个异常被抛出。结果就是控制权的直接转走( 可能退出多个语句 或者多个构造程序,实例初始化程序等) 。方法的调用直到发现一个t r y 语句块能捕获这 个异常。如果没有这样的t r y 语句块被发现,那这个抛出线程的执行在调用一个 u n c a u g h e x c e p t i o n 方法后就会被终止。 t h r o w s t a t e m e n t : 一 t h r o we x p r e s s i o n : 在t h r o w 语句中的表达式必须代表一个值,这个值是t h r o w a b i e 类型的,否则会有 一个编译时错误发生。此外,至少如下的三个条件中有一个是真的,否则会有一个编译 时错误发生: ( i ) 异常不是一个检查异常,特别的,如下情况中有一个是真的: ( 1 1 ) 抛出语句中表达式的类型是r u n t i m e e x c e p t i o n 或者是其子类型。 ( 1 2 ) 抛出语句中表达式的类型是e r r o r 或者是其子类型。 ( 2 ) 抛出语句包含在t r y 语句中的t r y 块中并且表达式的类型对于c a t c h 子句来 说是可指定的。( 这种情况下,我们称抛出的值被t r y 语句捕获) ( 3 ) 抛出语旬被包含在方法中或者构造者中并且t h r o w 语句中的表达式类型是可 指定的,是t h r o w 语句中列出的类型中的一个。 t h r o w 语句首先要计算表达式的值。如果计算过程中由于某种原因突然完成,那么 t h r o w 语句由于同样原因突然完成。如果表达式的计算正常完成,并且产生了一个非空的 值v ,那么t h r o w 语句突然完成,原因就在于带有v 的抛出语句。如果表达式的值的计算 正常完成,产生一个空值,那么个n u l l p o i n t e x c e p t i o n 的实例v 生成了并被抛出( 代 替空) 。抛出语句突然完成,原因在于带有值v 的t h r o w 语句。 如果在t r y 语句块中包含t h r o w 语句,在控制权转交给外面的程序前要先执行 f i n a l l y 语句,直到抛出的值被捕获。另外,要注意到突然终止的f i n a l l y 语句会破坏由 t h r o w 语句引起的控制权的传递。 如果t h r e w 语句被包含在一个方法声明中,只是其值没有被包含这个t h r o w 语句的 任何t r y 语句所捕获,然后这个方法调用因为t h r o w 而突然完成。 7 j a v a 语言的异常处理机制的公理语义 如果t h r o w 语句被包含在构造程序的声明中,但是如果它的值没有被外边包含的t r y 语句所捕获,那么类实例产生并调用调用构造者的表达式将由于t h r o w 突然完成。 如果t h r o w 语句包含在一个静态初始化程序,然后有一个编译时间检查来确信它的值 总是一个未检查类型或者它的值被所包含的t r y 语句所捕获。如果在运行时,忽略检查, 值不能被包含那个t h r o w 语句的t r y 语句块所捕获,那么值就被再次抛出如果它是e r r o r 的实例或者其子类的实例;否则,他就被包装成e x c e p t i o n i n i n i t i a l i z e r e r r o r 对象, 然后把它抛出。 如果t h r o w 语句被包含在实例初始化程序,然后一个编译时问检查确信或者它的值 是一个非检查异常或者它的值总被一些更外层的t r y 语句块所捕获,否则就会在类构造 程序中有抛出语句抛出可抛出异常类型( 或者其子类型) 。 用户声明的可抛出类型通常被声明成e x c e p t i o n 类型的子类,e x c e p t i o n 是 t h r o w a b l e 的子类。 1 1 5 2 t r y 语句 一个t r y 语句执行一个程序块。如果一个值被抛出并且t r y 语句有一个或者多个c a t c h 子旬可以捕获它,然后控制权被交给第一个这样的c a t c h 子句。如果这个t r y 语句有一 个f i n a l l y 语句,那么f i n a l l y 语句块中的程序将被执行,不管t r y 块是正常完成还是 突然完成,并且也与c a t c h 子句是否被先给与控制权无关。 t r y s t a t e m e n t : t r yb l o c kc a t c h e s t r yb l o c kc a t c h e s 。p tf i n a l l y c a t c h e s : c a t c h c l a u s e c a t c h e sc a t c h c l a u s e c a t c h c l a u s e : c a t c h ( f o r m a l p a r a m e t e r ) b l o c k f i n a l l y : f i n a l l yb l o c k 关键词t r y 后面的程序块被叫做t r y 语句的t r y 块。在关键词f i n a l l y 后面的程序 块叫做t r y 语句的f i n a l l y 块。 t r y 语句可以带有c a t c h 子旬( 也被称作异常处理程序) 。c a t c h 予句一定耍有一个参 数( 它也被叫作异常参数) ;这个异常参数的类型必须是t h r o w a b l e 或者t h r o w a b l e 的予 类,或者就会有编译时间错误发生。这个异常参数的做用范围就在c a t c h 子句中。 c a t c h 子旬的异常参数必须有一个同名的局部变量或方法的参数或直接包含c a t c h 子 句的初始化程序块,否则回有编译时间错误发生。 在c a t c h 子句,参数名不可以被再次声明为所包含的方法或初始化程序块中的局部变 量,也不能声明为所包含的方法或初始化块中t r y 语句中c a t c h 予句的异常参数,否则 会有一个编译时间错误的发生。 r j a v a 语言的异常处理机制的公理语义 异常处理程序被安从左到右的顺序查找:最近的可能的c a t c h 子旬捕获这个异常,得 到那个抛出异常对象作为参数。 f i n a l l y 语句确定的在t r y 块和可能的c a t c h 子旬执行之后被执行,不管程序执行的 控制权是否在t r y 块或者c a t c h 子旬中被传递走。 处理f i n a l l y 程序块是相当复杂的,因此t r y 语句带有f i n a l l y 块和没带有f i n a l l y 块被分别描述。 1 1 5 2 1 t r y - o a t c h 的执行 没有f i n a l l y 块的t r y 语句的执行首先要执行t r y 程序块。然后就有一个选择: ( 1 ) 如果t r y 块正常完成,那么就没有更多的动作了并且t r y 语句正常完成。 ( 2 ) 如果t r y 块因为抛出一个值v 而突然完成,那就有个选择; ( 2 1 ) 如果v 的运行时类型是对于t r y 语句的c a t c h 子旬可赋值的,那么第一个 ( 按调用顺序) ,这个c a t c h 子句被选中。值v 被赋值给被选中的c a t c h 子旬, 然后c a t c h 子句就执行了。如果那个程序块正常执行,那么t r y 语句正常完成; 如果程序块由于某种原因突然完成,那么t r y 语句因为同样原因突然原因结束。 ( 2 2 ) 如果v 的运行时类型对于t r y 语句的任何c a t c h 子旬都是不可赋值的,那 么t r y 语句因为抛出的值v 突然完成。 ( 3 ) 如果t r y 程序块由于某种原因飞正常完成,那么t r y 语句由于同样原因突然完成。 如下例: c l a s sb l e w l te x t e n d se x c e p t i o n b l e w i t0 ) b l e w i t ( s t r i n gs ) s u p e r ( s ) : c l a s st e s t s t a t i cv o i db i o w u p0t h r o w sb l e w l t t h r o wn e wg l e w l t0 : p u b l i c s t a t i cv o i dm a i n ( s t r i n g 口a r g s ) f t r yf b l o w u p 0 : ) c a t c h ( r u n t i m e e x c e p t i o nr ) s y s t e m o u t p r i n t l n ( ”r u n t i m e e x c e p t i o n :”十r ) : ) c a t c h ( b l e w l tb ) s y s t e m o u t p r i n t l n ( ”b l e w l t ”) : ) ) 方法b l o w u p 抛出异常b l e w i t ,在主函数体中t r y c a t c h 语句有两个c a t c h 子句。异 常的运行时类型是8 1 e w l t 它不能赋值给r u n t i m e e x c e p t i o n 类型交量。但是可赋值给变 量b l e w i t ,因此上例的输出结果是: 0 一 j a v a 语言的异常处理机制的公理语义 b 1 e w i t 1 1 5 2 2 t r y c a t c h f i n a i | y 的执行 一个带有f i n a l l y 块的t r y 语句的执行,首先要执行t r y 程序块。然后就有一个选择: ( 1 ) t r y 块正常执行结束后f i n a l l y 块执行,然后又一个选择: ( i 1 ) 如果f i n a l l y 块正常执行结束,就称t r y 语句正常执行。 ( 1 2 ) 如果f i n a l l y 块由于某种原因s 突然完成,就称t r y 语句由于s 突然完成。 ( 2 ) 如果t r y 块由于抛出值v 突然完成,就有一个选择: ( 2 i ) 如果v 的运行时类型可以赋值给t r y 块中的c a t c h 子句,然后选中第一个 c a t c h 子句。值v 赋值给选中的c a t c h 子句的参数,然后c a t c h 子句被执行。然 后有一个选择: ( 2 1 i ) 如果c a t c h 子旬正常完成,那么f i n a l l y 块就被执行。然后有一个选 择: ( 2 i 1 i ) 如果f i n a l l y 块正常完成,就称t r y 块正常完成。 ( 2 i i 2 ) 如果f i n a l l y 块由于某种原因突然完成,就称t r y 块由于同 样原因正常完成。 ( 2 1 2 ) 如果c a t c h 子句由于某种原因r 突然完成,那么f i n a l l y 块就执行。 然后有一个选择: ( 2 1 2 1 ) 如果f i n a l l y 语句正常完成,那t r y 语句由于r 突然完成。 ( 2 i 2 2 ) 如果f i n a l l y 块由于某种原因s 突然完成,那么t r y 语句由于 s 突然完成。( r 被丢弃) ( 2 2 ) 如果v 的运行是类型可以被赋值给t r y 语句的c a t c h 子句,然后f i n a l l y 块被执行。然后有一个选择: ( 2 2 1 ) 如果f i n a l l y 块正常完成,然后t r y 块由于抛出值v 突然完成。 ( 2 2 2 ) 如果f i n a l l y 块由于某种原因s 突然完成,那么t r y 语句由于s 突然 完成。( 并且抛出值v 被抛弃和忘记) ( 3 ) 如果t r y 块的执行由于其它原因r 而突然完成,那么f i n a l l y 块被执行。然后有 一个选择: ( 3 1 ) 如果f i n a l l y 块正常完成,那么t r y 语句由于r 突然完成。 ( 3 2 ) 如果f i n a l l y 块由于某种原因s 突然完成,那么t r y 语句由于原因s 突然 完成( 原因r 被丢弃) 例子如下: c l a s sb l e w l te x t e n d se x c e p t i o n b l e w i t 0 b l e w i t ( s t r i n gs ) s u p e r ( s ) : c l a s st e s t s t a t i cv o i db l o w u p0t h r o w sb l e w l t t h r o wn e wn u l l p o i n t e r e x c e p t i o n0 : 1 n j a v a 语言的异常处理机制的公理语义 p u b l i cs t a t i cv o i dm a i n ( s t r i n g 口a r g s ) ( t r y b l o w u p ( ) : c a t c h ( b l e w l tb ) s y s t e m o u t p r i n t l n ( ”b l e w l t ”) : ) f i n a l l y s y s t e m o u t p r i n t l n ( ”u n c a u g h te x c e p t i o n ”) : ) j 其运行结果如下: u n c a u g h te x c e p t i o n j a v a 1 a n g n u l l p o i n t e r e x c e p t i o n a tt e s t ,b l o w u p ( t e s t j a v a :7 ) a tt e s t m a i n ( t e s t j a v a :1 1 ) n u 土l p o i n t e x c e p t i o n 是被方法b l o w u p 抛出的没有被主函数中的t r y 语旬所捕获,因为 n u l l p o i n t e x c e p t i o n 不能赋值给b l e w l t 。之后,执行f i n a l l y 子句,然后线程继续执行 m a i n ,( 这是这个程序仅有的线程) ,然后程序因为未捕获的线程而终止,得到上面的结 果。 1 2 表达式 程序中很大一部分工作在于计算表达式的值,要么用来给变量赋值,要么把得到的值 用作参数或大的表达式中的操作数,或影响语句中的执行序列,或同时包含后两个。以 下主要表述表达式的意义和计算表达式值的规则。 1 2 1 表达式求值 1 2 1 1 表达式求值 当程序中的表达式被计算( 执行) ,结果往往代表如下三者中的个: ( 1 ) 一个变量 ( 2 ) 一个值 ( 3 ) 空或者不代表任何东西( 表达式被称作v o i d ) 计算表达式的值也有副作用,因为表达式可以包含赋值,增量运算符,减量运算符, 和方法调用。 一个表达式不代表任何东西当并且仅当它是一个方法调用,这个方法调用也没有返 回值,也就是说,方法被声明为空( v o i d ) 。一个本质是方法调用的表达式语句可以调用 1 1 j a v a 语言的异常处理机制的公理语义 一个有返回值的方法;这种情况下,返回值被悄悄丢弃。 1 2 1 2 变量当作值 如果一个表达式代表一个变量,在进一步计算时需要一个值,那个变量的值就被使用。 如果一个表达式代表一个变量或者一个值,然后一个表达式有一个编译时确定的类 型。 1 2 2 表达式和运行时检查 如果表达式的类型是原始类型,那么表达式的值也是同样的原始类型。但是如果表达 式的类型是引用类型,那么引用对象所属的类或这个值是一个对象的引用不是空,这些 在编译时并不是必须知道的。j a v a 语言中有一些地方,引用对象的实际所属类会在某种 程度上影响程序的执行,而这些错误的发生是不能从表达式类型中推断出来。如下: ( 1 ) 方法调用。方法调用使用0 m ( ) ,这里方法的选择是基于1 3 的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论