1) 异常处理机制
在程序运行过程中,如果某条语句执行出现意外(比如,零除错误,IO错误等),那么Java的虚拟机就会停下,不会继续执行后续的语句,而是由里到外(因为一个方法内部,异常捕获是可以嵌套的),沿被调用关系寻找异常处理模块,如果:
A) 最终找到异常处理模块,则转而执行异常处理模块中的语句,异常处理语句执行完成后,则继续执行异常处理模块的后续语句(可能是finally模块),如下:
public class ExceptionTest {
public static void main(String[] args) throws Exception {
try {
CallSomeMethods.DoA1();
} catch (ExceptionA e) {
// TODO Auto-generated catch block
HandlingSomething.PrintMsg(e.getMessage());//A2-7
}
System.out.println("执行完毕!");//A1-7,A2-8
}
}
class ExceptionA extends Exception
{
public ExceptionA() {
super("ExceptionA");
}
public ExceptionA(String Msg) {
super(Msg);
}
}
class ExceptionA1 extends ExceptionA
{
public ExceptionA1() {
super("ExceptionA1");
}
}
class ExceptionA2 extends ExceptionA
{
public ExceptionA2() {
super("ExceptionA2");
}
}
class CallSomeMethods{
public static void DoA1() throws Exception {
// 1 异常处理代码模块开始
try {
// 2异常捕获代码块开始
try {
//要测试哪个异常,请把产生该异常的语句放在前面
HandlingSomething.DoA3(); //A3-1
HandlingSomething.DoA2(); //A2-1
HandlingSomething.DoA1(); //A1-1
} catch (ExceptionA1 e) {
HandlingSomething.PrintMsg(e.getMessage());//A1-2
} catch (ExceptionA e) {
// 这里从新抛出只是为了演示finally块一定会被执行.
// 继续抛出
HandlingSomething.PrintMsg("继续跑出2");//A2-2
throw new ExceptionA(e.getMessage()+":继续跑出2");//A2-3
} finally {
HandlingSomething.PrintMsg("这里总会执行1");//A1-3,A2-4,A3-2
}
// 2异常捕获代码块结束
// 2异常后续语句,如果前面的异常被处理而又没有抛出新的异常就会被执行。
System.out.println("这是异常捕获处理模块2的后续语句"); //A1-4
} catch (ExceptionA e) {
// 继续抛出
HandlingSomething.PrintMsg("继续跑出1");//A2-5
throw new ExceptionA(e.getMessage()+":继续跑出1");//A2-6
}
finally
{
HandlingSomething.PrintMsg("这里总会执行2");//A1-5,A2-7,A3-3
}
// 1 异常处理代码模块结束
// 1异常后续语句,如果前面的异常被处理而又没有抛出新的异常就会被执行。
HandlingSomething.PrintMsg("这是异常捕获处理模块1的后续语句");//A1-6
}
}
class HandlingSomething
{
//这里为了演示,所以只简单的抛出异常
public static void DoA1() throws ExceptionA1
{
throw new ExceptionA1();
}
//这里为了演示,所以只简单的抛出异常
public static void DoA2() throws ExceptionA2
{
throw new ExceptionA2();
}
public static void DoA3() throws Exception
{
throw new Exception("这个异常不处理!");
}
synchronized public static void PrintMsg(String Msg) {
SimpleDateFormat theA =new SimpleDateFormat("yyyyMMddHHmmss");
System.out.println(Msg+":"+ theA.format(new java.util.Date()));
}
}
B)如果找不打异常处理块,最后会由Java虚拟机进行处理,是否会结束程序,要看具体的程序和具体的异常,上述测试DoA3时是会结束程序的。
Java和C#的异常处理机制也是典型的责任链模式。
2) 捕获方式
用try块将可能产生异常的代码包含起来,接着就是异常匹配处理块,异常匹配处理块可以有多个,注意:
异常匹配是按顺序进行的,找到匹配的异常处理块后,后面的匹配就会放弃匹配,因此在书写匹配块时,在异常类继承体系中,层次越低的放在前面,
层次越高的在后面。因为异常匹配不是精确匹配优先,而是匹配顺序优先,匹配只要满足“是”关系就可以了,也就是如果一个异常类是A,那么A及A的
所有子异常类都能在异常类A匹配的地方得到匹配。
3) 比较:
与C#相比,Java的异常处理机制更加严谨一些,它要求你对可能的异常A要么处理,要么显示的向调用者声明你没有处理异常A,否则Java的编译器就会报编译错误。
当然事情都是两面性的,在编译期就保证异常得到正确的处理当然是好事,但这种机制也会带来一些问题,一是如果调用关系复杂,异常比较多,代码看起来就不那么纯粹,
会稍显凌乱;二是对程序员的要求会比较高,特别是在写牵扯到事务的底层代码时,程序员必须非常谨慎的对待异常的处理,不能屏蔽上层调用的事务机制。除非必要,对于涉及到事务机制的代码中的异常应该尽量抛给调用者去处理。
分享到:
相关推荐
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。
"Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...
《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...
【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...
总的来说,这份"Java学习笔记PPT"是初学者和进阶者学习Java的理想资料,覆盖了语言基础、面向对象、集合框架、异常处理、I/O系统、多线程等多个方面,旨在帮助读者系统地掌握Java编程技能,并能灵活运用到实际项目中...
这份“Java学习笔记(必看经典).doc”文档将涵盖Java的核心概念和重要知识点,对于初学者和有经验的开发者来说都是宝贵的参考资料。 首先,Java的基础部分通常包括以下几个方面: 1. **Java语法基础**:这是所有...
这份《Java学习笔记》包含了丰富的知识内容,旨在帮助学习者全面掌握Java编程技术。笔记分为7个PDF部分,覆盖了从基础到高级的Java编程概念。 1. **Java基础知识**:这部分内容通常包括Java的历史背景、环境配置、...
【Java学习笔记模版】 Java实习工程师在学习过程中,会涉及到许多关键知识点,尤其是在企业级开发的场景下。从给出的四天学习笔记来看,实习生正在逐步掌握Java Web开发的基础和核心技能。以下是对这些知识点的详细...
Java学习笔记全集是针对Java编程语言的一份详尽的学习资料,它涵盖了从基础到进阶的各个层面,旨在帮助初学者系统地学习Java,并为有一定经验的开发者提供复习和巩固知识的平台。这份笔记主要关注Java语言的核心概念...
而今天,我们要介绍的这份《良葛格JAVA学习笔记》便是一份得到广泛好评,深受学习者喜爱的学习资源。 首先,我们不得不提的是这份笔记的作者——“良葛格”,一个在编程教育界颇具声望的人物。他的这份学习笔记因...
【Java学习笔记(源码)】是一份详细记录了Java编程语言学习过程的资源集合,包含实际的源代码示例。这份笔记旨在帮助初学者和有一定经验的开发者深入理解和掌握Java语言的核心概念、语法以及常见应用。以下是笔记中...
《良葛格java学习笔记》是一份集合了Java学习精华的资源,主要针对初学者和对Java编程感兴趣的读者。这份笔记是由用户从良葛格的网站上精心整理并转化为CHM格式,便于阅读和查阅。CHM(Compiled Help Manual)是微软...
2. **Java语法**:讲解变量、数据类型、运算符、流程控制(如if语句、switch语句、循环结构)以及异常处理等基础语法。 3. **面向对象编程**:详细阐述类、对象、封装、继承、多态等概念,这是Java的核心特性,也是...
这份“Java学习笔记”是为初学者准备的,旨在帮助他们快速掌握Java的基础知识。笔记中可能涵盖了以下重要知识点: 1. **Java简介**:Java是由Sun Microsystems(现已被Oracle收购)开发的,它的设计目标是“一次...
Java学习笔记——异常 在Java编程中,异常处理是一项至关重要的技能,它允许开发者优雅地处理程序运行时可能遇到的问题,防止程序意外终止,并提供有用的反馈信息。异常是程序执行过程中遇到的不正常情况,例如除以...
《林信良Java学习笔记》是一本深受程序员喜爱的Java学习资源,尤其因其繁体字版,对于中文读者来说,提供了更为亲切的阅读体验。这本书深入浅出地讲解了Java编程语言的基础知识和高级特性,旨在帮助初学者快速掌握...
### Java学习笔记——基础知识详解 #### 一、Java基本数据类型及内存占用 Java作为一种广泛使用的编程语言,其基础数据类型对于理解程序的行为至关重要。Java提供了八种基本数据类型,分为数值型、字符型和布尔型...
【JAVA学习笔记】是一份专为Java初学者设计的学习资源,包含了从基础知识到进阶概念的全面讲解。PDF版的格式使得学习者可以方便地在各种设备上阅读和打印,随时随地提升自己的Java技能。 这份笔记可能涵盖了以下几...
【Java学习笔记全套】是针对Java编程语言的一套全面学习资料,涵盖了Unix操作系统基础、SQL数据库操作、核心Java编程、Hibernate持久化框架、以及Spring框架等多个关键知识点。这些笔记旨在帮助初学者系统地掌握Java...