黑马程序员-java Exception异常个人知识整理

来源:互联网 发布:淘宝上做什么产品好 编辑:程序博客网 时间:2024/05/01 03:30


----------- android培训java培训、java学习型技术博客、期待与您交流! ------------ 

对于程序而言,出现的错误可以分为三类:

编译错误:没有遵循java语法规则,这种错误需要在编译阶段进行处理,否则程序不能运行。

逻辑错误:没有按照对应的逻辑来运行,但是编译正确,能正常运行,只是结果错误。

运行时错误:运行的过程中出现的不可执行的操作,在运行时报错。 

在java程序中,什么异常?

异常:是程序执行期间发生的各种意外或错误,它会中断指令的正常执行,影响程序的正常运行,比如说:找不到文件、内存不足、数组下标越界和输入出错等问题。

 

在Java中异常分为两大类:编译异常运行异常

 

产生的异常可以细分为三种类型:

1.java虚拟机在运行时,由于某些内部错误产生的异常,这类异常不在用户程序的控制之内,也不需要进行处理的这类异常。

2.标准类异常,java系统预先定义好的,由于程序代码中的错误而产生的,这里需要对程序异常进行处理。

3.用户自定义的一个异常类,但是他需要继承java的异常类。

 

Java 语言中,错误类的基类是java.lang.Error,异常类的基类是java.lang.Exception,所有Error(错误)或Exception(异常)的超类是Throwable 类,当对象是此类或者其子类的实现,才能使用异常抛出thow语句和作为catch 子句中的参数类型;

Error类:java虚拟机本身发生的错误,表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件的问题,比如,内存溢出等,对于这种错误程序基本无能为力,除了退出运行别无选择,所以将通知用户并且中断程序运行。

Exception类:表示一种设计或者实现问题,需要进行捕捉或者需要程序进行处理的异常,其中分为运行时异常(RuntimeException)和非运行时异常,其中RuntimeException可以不对其进行处理,但是非运行时异常就必须捕获或者申明抛出的异常。

 

在处理异常时,应该区分checkedunchecked

unchecked就是Error和RuntimeException(运行时异常)的统称, 不需要try...catch...或throws 机制去处理的异常。

checked除了Error和RuntimeException,其他继承于java.lang.Exception的类,需要进行异常处理的类。这里需要注意的缺点是:代码效率低,耦合度过高

 

java异常类的结构图如下:

 

注:异常是针对方法来说的,抛出、声明、捕获和处理异常都是在方法中进行的;进行异常捕获时,先捕获小的异常,再捕获大的异常。

首先,那我们就来明确下异常处理的目的

主要目的是即使在程序运行时发生了错误,也要保证程序能正常结束,避免由于错误而使正在运行的程序中途停止。

java对异常的处理涉及两个方面内容:

1.抛出(throw)异常:程序运行的过程中出现了运行错误,能匹配预定义的某个异常类,那么系统就产生一个该异常类的对象,这个过程称其为抛出异常。

2.捕捉(catch)异常:根据抛出的异常对象,进行匹配处理的过程,叫做捕捉异常。

 

抛出异常的方式有两种:系统自动抛出人为异常抛出

其中,需要注意的是人为抛出,有两种形式:

1.在方法头写出需要抛出的异常(利用throws语句),例如下面代码:

throws的格式的:修饰符 返回值类型 方法名([参数列表])throws 异常类名1,异常类名2,……{方法体}

public class Throws_Exp{public static void main(String[] args) throws ArithmeticException,ArrayIndexOutOfBoundsException{ int a=4,b=0,c[]={1,2,3,4,5};System.out.println(a/b);System.out.println(c[a+1]);}}       

2.在方法体内抛出异常(利用throw语句),例如下面代码:

throw的格式:throw  异常类对象名 / (new 异常类名());

public class Throw_Exp {public static void main(String[] args) {int a = 3, b = 0,c[]={1,2,3,4,5};ArithmeticException e=new ArithmeticException();if (b == 0)throw e;System.out.println(a / b);if (c.length <= a)throw (new ArrayIndexOutOfBoundsException());System.out.println(c[a]);}}

注:执行throw语句时,程序将不会再执行throw后面的语句。

 

由于上面的程序没有进行异常的处理,因此抛出的异常都java系统自动捕捉,进行相应的处理。那么按照java规范来说,能够预测程序中可能发生的异常,则应该对异常进行处理,否则,交给java系统处理。

 

那么自己捕捉和处理异常,要通过try-catch-finally语句块,用法如下:

try{   //在此区域内或能发生异常;}catch(异常类A   e1) {   //该catch子句能够捕捉和处理的异常类型//处理异常A;}catch(异常类B   e2){//处理异常B; }finally{//不论异常是否发生,都要执行的部分; }

对于try-catch-finally结构的说明:

 A:将可能发生异常的程序代码放置在try程序块中。如果该块内的代码出现了异常,系统将终止try块代码的执行,自动跳转到所发生的异常类对应的catch块中,执行该块中的代码。如果程序运行正常,后面的各catch块不起任何作用。

B:finally块是个可选项,无论异常是否发生,finally块的代码必定执行。通常把对各种异常共同处理部分放在finally块中,如输出统一信息、释放资源、清理内存、关闭已打开的文件等。

C:一个try块可以对应多个catch块,用于对多个异常类进行捕获。但最多只能选中一个执行。

D:异常对象与catch块中声明的实例的匹配原则:
 1.异常对象是catch块中声明的异常类的实例;
 2.异常对象是catch块中声明的异常类的某一子类的实例;

 

注意

1.try-catch-finally结构里面出现return语句,finally{}里面的代码先执,然后在执行return语句。

2.使用System.exit(1)来退出虚拟机,则finally{}中的语句将不会被执行。

 

示例代码如下:

public static void close(Connection conn){try{if(conn != null){conn.close(); //关闭数据库链接}}catch(Exception e){  //System.out.println(e.getMessage()); //打印报错信息}finally{conn = null;  ////强制释放conn链接}}

 

自定义的异常类:异常类必须是Throwable类或Exception类的子类。

自定义的异常类,一般只要声明两个构造方法,一个是不用参数的,另一个以字符串为参数。作为构造方法参数的字符串应当反映异常的信息。

实例代码如下:

public class MyFirstException extends Exception {public MyFirstException(){super(); }public MyFirstException(String msg) {super(msg);}}

注:用户定义的异常同样要用try--catch捕获,但必须由用户自己抛出 throw new  定义的异常类名();

 

Java异常处理的原则和技巧:

      1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。
4、不要把自己能处理的异常抛给别人。
5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。

 

原创粉丝点击