文档章节

javaSe-异常处理机制

wersdffg
 wersdffg
发布于 2012/05/23 01:01
字数 1807
阅读 45
收藏 2

Error异常

Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能中止运行,例如JAVA 虚拟机出现错误。Error是一种unchecked Exception,编译器不会检查Error是否被处理,在程序中不用捕获Error类型的异常。一般情况下,在程序中也不应该抛出Error类型的异常。

RuntimeException异常

Exception异常包括RuntimeException异常和其他非RuntimeException的异常。RuntimeException 是一种Unchecked Exception,即表示编译器不会检查程序是否对RuntimeException作了处理,在程序中不必捕获RuntimException类型的异常,也不必在方法体声明抛出RuntimeException类。RuntimeException发生的时候,表示程序中出现了编程错误,所以应该找出错误修改程序,而不是去捕获RuntimeException。

Checked Exception异常

Checked Exception异常,这也是在编程中使用最多的Exception,所有继承自Exception并且不是RuntimeException的异常都是checked Exception,上图中的IOException和ClassNotFoundException。JAVA 语言规定必须对checked Exception作处理,编译器会对此作检查,要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exception进行处理,不然不能通过编译。

为什么要在声明方法抛出异常?

方法是否抛出异常与方法返回值的类型一样重要。假设方法抛出异常却没有声明该方法将抛出异常,那么客户程序员可以调用这个方法而且不用编写处理异常的代码。那么,一旦出现异常,那么这个异常就没有合适的异常控制器来解决。

为什么抛出的异常一定是已检查异常?RuntimeException与Error可以在任何代码中产生,它们不需要由程序员显示的抛出,一旦出现错误,那么相应的异常会被自动抛出。遇到Error,程序员一般是无能为力的;遇到RuntimeException,那么一定是程序存在逻辑错误,要对程序进行修改;只有已检查异常才是程序员所关心的,程序应该且仅应该抛出或处理已检查异常。而已检查异常是由程序员抛出的,这分为两种情况:客户程序员调用会抛出异常的库函数;客户程序员自己使用throw语句抛出异常。

注意:覆盖父类某方法的子类方法不能抛出比父类方法更多的异常,所以,有时设计父类的方法时会声明抛出异常,但实际的实现方法的代码却并不抛出异常,这样做的目的就是为了方便子类方法覆盖父类方法时可以抛出异常。

使用finally块释放资源

finally关键字保证无论程序使用任何方式离开try块,finally中的语句都会被执行。在以下三种情况下会进入finally块:

(1) try块中的代码正常执行完毕。

(2) 在try块中抛出异常。

(3) 在try块中执行return、break、continue。

因此,当你需要一个地方来执行在任何情况下都必须执行的代码时,就可以将这些代码放入finally块中。当你的程序中使用了外界资源,如数据库连接,文件等,必须将释放这些资源的代码写入finally块中。

必须注意的是:在finally块中不能抛出异常。JAVA异常处理机制保证无论在任何情况下必须先执行finally块然后再离开try块,因此在try块中发生异常的时候,JAVA虚拟机先转到finally块执行finally块中的代码,finally块执行完毕后,再向外抛出异常。如果在finally块中抛出异常,try块捕捉的异常就不能抛出,外部捕捉到的异常就是finally块中的异常信息,而try块中发生的真正的异常堆栈信息则丢失了。
  
 异常处理要害字
  Java的异常处理是通过5个要害字来实现的:try,catch,throw,throws,finally。JB的在线帮助中对这几个要害字是这样解释的:
  
  Throws: Lists the exceptions a method could throw.
  
  Throw:  Transfers control of the method to the exception handler.
  
  Try:  Opening exception-handling statement.
  
  Catch: Captures the exception.
  
  Finally: Runs its code before terminating the program.
  
   try语句
  try语句用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个例外。
  
  catch语句
  catch语句的参数类似于方法的声明,包括一个例外类型和一个例外对象。例外类型必须为Throwable类的子类,它指明了catch语句所处理的例外类型,例外对象则由运行时系统在try所指定的代码块中生成并被捕捉,大括号中包含对象的处理,其中可以调用对象的方法。
  
  catch语句可以有多个,分别处理不同类的例外。Java运行时系统从上到下分别对每个catch语句处理的例外类型进行检测,直到找到类型相匹配的catch语句为止。这里,类型匹配指catch所处理的例外类型与生成的例外对象的类型完全一致或者是它的父类,因此,catch语句的排列顺序应该是从非凡到一般。
  
  也可以用一个catch语句处理多个例外类型,这时它的例外类型参数应该是这多个例外类型的父类,程序设计中要根据具体的情况来选择catch语句的例外处理类型。
  
  finally语句
  try所限定的代码中,当抛弃一个例外时,其后的代码不会被执行。通过finally语句可以指定一块代码。无论try所指定的程序块中抛弃或不抛弃例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等。
  
  throws语句
  throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型。假如异常的类型是Error或 RuntimeException, 或它们的子类,这个规则不起作用, 因为这在程序的正常部分中是不期待出现的。 假如你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。
  
  throw语句
  throw总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。
资料引用:http://www.knowsky.com/365353.html

本文转载自:

共有 人打赏支持
wersdffg
粉丝 12
博文 86
码字总数 32304
作品 0
厦门
程序员
私信 提问
06-利用思维导图梳理JavaSE-异常处理

06-利用思维导图梳理JavaSE-异常处理 主要内容 1.异常处理 1.1.异常的基本概念 1.2.异常处理机制 1.3.异常处理方法 1.4.Exception与RuntimeException类 想了解飞鱼说编程的最新动态可以关注公...

飞鱼说编程
09/18
0
0
Java中异常Exception的实现的一些分析

文章地址:http://blog.csdn.net/hengyunabc/article/details/14108617 前言: 最近发现一个很有用的Eclipse插件:http://andrei.gmxhome.de/bytecode/,可以在Eclipse直接查看,调试Java的字...

横云断岭
2013/11/03
0
0
JAVASE中级笔记

n 内部类:定义在一个类内部的类,就称为内部类 u 内部类分为3种 ² 成员内部类:相当于成员变量 ² 局部内部类:定义在方法内部的,相当于局部变量(极少用到,了解即可) ² 匿名内部类:(...

超人学院
2016/07/26
41
0
00-利用思维导图梳理JavaSE基础知识-持续更新中!

利用思维导图梳理JavaSE基础知识-持续更新中! 万丈高楼平地起,要想学好技术,首先要把基础打扎实,所谓地基决定高度,所以,我将我以前学习JavaSE时自己梳理总结的思维导图分享给准备入门J...

飞鱼说编程
09/11
0
0
javase总结报告

学习了这么久的java,我打算在这个暑假期间进行javase的总结,加深自己对java基础的理解 总结的重点有以下几个部分: 1.Socket网络编程 2.I/O文本操作 3.多线程 4.java集合框架 5.异常处理 ...

24_hours
2014/07/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-2

上篇文章(java框架学习日志-1)虽然跟着写了例子,也理解为什么这么写,但是有个疑问,为什么叫控制反转?控制的是什么?反转又是什么? 控制其实就是控制对象的创建。 反转与正转对应,正转...

白话
20分钟前
0
0
Integer使用双等号比较会发生什么

话不多说,根据以下程序运行,打印的结果为什么不同? Integer a = 100;Integer b = 100;System.out.println(a == b);//print : trueInteger a = 200;Integer b = 200;System.out.pr...

兜兜毛毛
昨天
7
0
CockroachDB

百度云上的CockroachDB 云数据库 帮助文档 > 产品文档 > CockroachDB 云数据库 > 产品描述 开源NewSQL – CockroachDB在百度内部的应用与实践 嘉宾演讲视频及PPT回顾:http://suo.im/5bnORh ...

miaojiangmin
昨天
4
0
I2C EEPROM驱动实例分析

上篇分析了Linux Kernel中的I2C驱动框架,本篇举一个具体的I2C设备驱动(eeprom)来对I2C设备驱动有个实际的认识。 s3c24xx系列集成了一个基于I2C的eeprom设备at24cxx系列。at24cxx系列芯片包...

yepanl
昨天
5
0
设计模式之工厂模式

本篇博文主要翻译这篇文章: https://www.journaldev.com/1392/factory-design-pattern-in-java 由于翻译水平有限,自认为许多地方翻译不恰当,欢迎各位给出宝贵的建议,建议大家去阅读原文。...

firepation
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部