异常处理机制

1.使用try...catch捕捉异常

如果执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,这个异常对象会被提交给Java的运行时环境,把这个过程叫做“抛出异常”

java的运行时环境受到异常对象后,就会寻找这个异常对象的处理catch语句,如果找到合适的,就把这个异常对象交给catch语句块处理,这个过程被称为“捕获异常” 要是捕获不到异常,运行时环境被终止,退出程序

无论处在哪里的代码块,只要出现异常,都会产生异常对象。

2.异常类的继承体系

try{

statement1

statement2

}

catch(ExceptionClass1 e1){

....

}

catch(ExceptionClass2 e2){

....

}

...

每个catch语句里都是处理该异常类及其子类的异常实例

try语句里面的语句出现异常,生成异常对象,运行时环境接收到异常对象后,以此判断该异常对象是否是catch块后异常类或其子类的实例,如果是,将调用该catch块来处理该异常,不会向下进行,否则再次拿该异常对象和下一个catch块里的异常类进行比较

try块里声明的变量时代码块内局部变量,它只在try块内有效,在catch块里不能访问该变量。

异常类的继承树

Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),他们都继承Throwable 父类

Error错误,一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态连接失败等,这种错误无法恢复或不可能捕捉,将导致应用程序中断。通常应用程序无法处理这些错误,因此应用程序不应该试图用catch块来捕获Error对象,在定义该方法时,也无需再其throws子句中声明该方法可能跑出Error及其任何子类

4.多异常捕获

自从java7开始,一个catch块可以捕获多种类型的异常:

1.捕获多种类型的异常时,多种异常类型之间用竖线(|)隔开。

2.捕获多种类型的异常时,异常变量有隐式的final修饰,因此程序不能对异常变量重新赋值

5.访问异常信息

d当java运行时决定使用某个catch块来处理该异常对象时,会将异常对象赋给catch块后的异常参数。所有的异常对象都包括了几个方法

getMessage()异常的详细描述字符串

printStackTrace()将该异常的跟踪栈信息输出到标准错误输出

printStackTrace(PrintStream s)将该异常的跟踪栈信息输出到指定输出流

getStackTrace() 返回该异常的跟踪栈信息

6.使用finally回收资源

有些时候,在try块打开了一些系统物理资源(数据库连接、网络连接、磁盘文件等),这些物理资源必须显示回收

为了保证一定能回收try块中打开的资源,异常处理机制提供了finally块,finally块一定会被执行,即使前面出现了return语句,如果在异常处理代码中使用了system.exit(1)(关闭虚拟机)语句,那么finally就失去了执行的机会。

异常处理语句结构里面try是必须的,没有try,就不能有catch和finally,catch和finally至少出现其中之一。

注意:尽量不要在finally块中使用return或throw等导致方法终止的语句。一旦使用,将会使try、catch里面的return、throw失去意义

当java程序执行try、catch时遇到了return或者throw,就会找有没有finally语句,如果有,就会执行finally语句里面的,如果finally里面有return或throw,那么方法就会终止,try、catch里面的语句就失去了执行的机会

7.自动关闭资源的try语句

为了避免代码的臃肿,java7增强了try语句的功能--允许在try关键字后面紧跟一对括号,括号内可以声明、初始化一个或多个资源(必须显示关闭的).try语句在语句结束后自动关系这些资源。这些资源实现类必须实现AutoCloseable或Closeable接口,实现这两个接口必须实现close()方法。

8.Checked异常和Runtime异常

1.RuntimeException类及其子类的实例被称为Runtime异常。

2.不是RuntimeException类及其子类的实例成为Checked异常(只有java提供)

java认为Checked异常都是可以被修复的异常,所以必须被显示处理,如果没有处理,编译就会发生错误。

对Checked的处理方式有两种:

1)、当前方法明确知道如何处理该异常,程序应该使用try。。。catch语句,在对应的catch块中修复该异常

2)、当前方法不知道该如何处理这种异常,在定义该方法时声明跑出该异常

8.1 使用throws声明抛出异常

    使用throws声明抛出异常的思路是,当前方法不知道如果处理这种类型的异常,由上一级调用者处理;如果main方法也不知道如何处理,也使用throws声明抛出异常。这个异常将交给jvm处理。JVM对异常的处理方式是,打印异常的跟踪栈信息,并终止程序的运行。throws声明抛出只能在方法签名中使用,一旦使用了throws抛出了异常,就不需要使用try...catch块来捕获该异常了

也就是说,如果某段代码调用了一个带throws声明的方法,该方法声明抛出了checked异常,则表明该方法希望它的调用者来处理该异常(调用该方法时要么放在try块里显示捕获该异常,要么放在另一个带throws声明跑出的方法中)子类方法声明跑出的异常不允许比父类方法声明跑出的异常多

大部分时间下推荐使用Runtime异常,一旦发生了自定义错误,程序只管抛出Runtime异常即可

9.使用throw抛出异常

时间: 2024-10-07 06:40:04

异常处理机制的相关文章

深入理解Java异常处理机制

1. 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,"猜猜"它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. <span style="background-color: rgb(255, 255, 255

Java异常处理机制的秘密

一.结论 这些结论你可能从未听说过,但其正确性是毋庸置疑的,不妨先看看: 1.catch中throw不一定能抛回到上一层,因为finally中的return会抑制这个throw2.finally中throw一定能抛回上一层,因为此时其后的return不会被执行到(throw中断了正常的顺序流)3.在try/catch中return并不会直接返回上一层,而是先执行finally再返回 二.一段小程序 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

C++学习笔记27:异常处理机制

一.异常处理机制基础 异常的定义 程序中可以检测的运行不正常的情况 异常处理的基本流程 某段程序代码在执行操作时发生特殊情况,引发一个特定的异常 另一段程序代码捕获该异常并处理它 二.异常的引发 throw 三.异常的捕获 try { ... } catch(...) 四.异常类与异常对象 五.异常处理策略 异常类可以派生和继承,形成类库架构 可捕获的异常对象的型式 普通型式(包括类):异常对象需要拷贝 对某型式对象的引用:没有额外的拷贝动作 指向某型式对象的指针:要求对象动态构造或者在catc

Java之异常处理机制

来源:深入理解java异常处理机制 2.Java异常    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常.因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件.当条件生成时,错误将引发异常. Java异常类层次结构图: 图1 Java异常类层次结构图 在 Java 中,所有的异常都有一个共同的祖先 Th

基于返回值的错误处理与异常处理机制

基于返回的错误处理和异常处理机制的比较 一.基于返回值的错误处理机制 对于传统的面向过程语言比如说C语言,通常使用基于返回值的错误处理机制,即通过在程序中定义程序出错时的返回值,比如说0代表操作成功,而1代表操作失败. 这种错误处理机制的好处在于有时候即使出现了异常程序或许也可以继续执行(但是最终执行结果或许不对,而这就导致查错比较困难,因为有时候仅仅通过函数返回值我们并不知道程序出错的原因究竟是什么,比如说程序操作失败返回值为0,我们在控制台上看到程序输出为0,但是除此之外没有其他额外的信息帮

深入理解java的异常处理机制

 JAVA异常的概念    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常.因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件.当条件生成时,错误将引发异常. Java异常类层次结构图: 图1 Java异常类层次结构图 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Thr

Java从零开始(3)异常处理机制

异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当的麻烦! Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,所有的异常都可以用一个类型来表示,不同类型的异常对应不同的子类异常(这里的异常包括错误概念),定义异常处理的规范,在1.4版本以后增加了异常链机制,从而便于跟踪异常!这是Java语

java异常处理机制

/* * 异常处理机制 * 1.分类:Error和Exception * Error错误是JVM自动报错的,程序员无法解决例如开数组过大int a[]=new int [1024*1024*1024]; * Exception错误时程序员要解决的问题,例如指针越界,零做除数 * 2.异常处理 * try{ * 需要检测是否发生异常的代码 * } * catch(Exception e){ * 处理异常的代码(一般是打印错误信息) * } * finally{ * 必须要运行的代码(一般是关闭数据

C++中的异常处理机制

C++中的捕获异常机制catch参数中实参的类型不同,采取的处理方式则不相同,且与普通的函数调用还不一样,具体表现为当抛出异常throw A()或throw obj时,对象会进行一次额外的对象复制操作. 测试类实现如下: #include <iostream> /** * 测试异常抛出与虚函数 */ using namespace std; class A { public: A() {cout << "A() " << endl;} ~A(){co

Atitit.js javascript异常处理机制与java异常的转换.js exception process Voae

Atitit.js javascript异常处理机制与java异常的转换.js exception processVoae 1. 1. javascript异常处理机制 1 2. 2. Web前后台异常的统一处理 1 3.  java异常转换为js异常 1 3. -------------详细代码 2 1. 1. javascript异常处理机制 Throw str Not throw error  ..cause ie,ff error obj is diff.. 2. 2. Web前后台异常