【Java学习笔记】异常

异常

(1)定义

运行时发生的不正常现象,其实异常就是java通过面对对象的思想将问题封装成对象,有异常类对其进行描述。不同的问题进行不同的描述。
Java异常处理机制:当程序出现异常时,一个异常对象就会产生,并将其交给运行时系统来找寻相应的代码处理异常,从而确保不会对系统造成伤害。
异常有两种:
一种是运行时系统自己产生的异常(系统自己已经定义的异常,如数组角标溢出);
另外一种是由用户代码用throw语句产生的异常(自定义异常);

(2)Throwable

throwable 及其所有的子类都具有可抛性
1.error(不可处理)
由jvm抛出的严重性问题一般不进行针对性处理,直接修改代码。
大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM出现的问题
2.exception(可以解决)
程序本身可以处理的异常。
注:无论是error还是exception都是问题,问题出现就必须抛出,让调用者知道并处理
该体系的特点:后缀都为其分类的名,阅读性强
异常和错误的区别:异常可以被程序本身可以处理,错误是无法处理。

(3)自定义异常

必须要继承异常体系,此时才具有可抛性
注:①编译时,若函数中存在自定义异常(java已定义好的类则不需要),必须在 函数中声明“throws”(可能会出现的异常)
②调用时,若函数中存在自定义异常(java已定义好的类则不需要),也要捕 捉或声明。
 ③自定义异常时继承了异常体系,只需要调用super();即可使用父类中的方法。

(4)异常的分类

异常分类

非运行时异常(编译时异常)
是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检测异常。
注:此问题是让在程序编译时检测出,并有对应的处理办法。
运行时异常
即Exception中的Runtime Exception及其子类。如空指针异常等,这些异常是不检测异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这种异常的发生。
注:此问题的发生时,是程序功能无法正常实现,通常是由使用者的原因所导致的(无法预测)。但此类问题不进行处理,直接会让程序编译通过,在运行时,让使用者使用时程序强制停止,让调用者进行代码修改。
所以自定义异常时,要么继承Exception。要么继承RuntimeException。

(5)throws 和throw的区别
Java中,异常的处理机制:抛出异常和捕捉异常。

抛出异常:当一个方法出现错误引发的异常时,方法创建异常对象并交付运行时系统,异常对象中包括了异常类型和异常出现时程序状态信息。运行时系统负责寻找处理异常的代码并执行。
捕捉异常:对有可能发生异常的代码进行异常捕捉。

注:一个方法所能捕捉到的异常,一定是Java代码在某处抛出的异常。简单来说,异常总是先抛出,后被捕捉。
1)throws使用在函数上(用于声明)。
throw使用在函数内(用于抛出)。
2)throws抛出的是异常类,可以抛出多个,用逗号隔开。
throw抛出的是异常对象

(6)异常的处理方式

对异常进行针对性处理方法
①具体格式

try
{    /*需要检测的代码*/   }
catch( 异常类 对象名)         //执行几个处理几个
{   /* 处理异常的代码*/    }
//多catch时将父类的catch(Exception e)// 放在最下面Exception e
finally                     //常用于数据库中,释放数据库表
{   /*一定会执行的代码  */  }
        注:若不用catch进行捕获(但要进行声明),则直接抛出异常

注:catch多个异常,只能够匹配一个异常;

(7)处理原则

①函数内容如果执行需要检测的异常(自定义异常时),那函数上的必须要声明,即需要在函数内用try catch 捕捉

②若调用到声明的异常的函数,要么用try catch 或 throws

③catch :功能内容可以解决
throws :解决不了的,告诉调用者,由调用者处理

④抛出几个,即catch 几个

⑤try catch finally 之间不能存在其他语句

⑥本层不同处理的异常,应该使用throws进行异常抛出,交给上一层进行异常处理

⑦使用try catch捕获的异常,应该进行异常处理,而不是为了编译通过而进行的捕捉,否则这样会造成冗余代码。

注:在jdk1.7后同一个catch中可以捕捉多了异常

(8)try catch finally组合特点

①try catch finally
②try catch(多个):没有必要资源需要释放时
③try finally :没有catch就要声明;异常无法用catch直接处理,但是需要释放资 源(关闭资源)

注:(1)以下4中状态finally块是不会被执行的:

1.在finally语句块中发生异常
2.在前面的代码中使用了System.exit()退出程序
3.程序所在的线程死亡
4.关闭CPU
(在try块或者catch块中遇到return语句时,finally语句块将在方法返回之前被执行 )

(9)异常的注意事项

1)如果子类继承并覆盖父类的功能时,子类抛出的异常只能是父类的异常或父类异常的子类
2)如果父类抛出多个异常,子类只能抛出父类的异常的子集

注:父类的方法没有抛出异常,子类覆盖是不能抛出异常,只能try

(10)jdbc中的try catch

在JDBC中,使用try catch应该注意以下几点。
1. 使用具体的异常处理类。不能直接使用Exception来接收所有的异常,应当使用专业的异常类,如SQLException来接收。
2. try的范围尽量准确。监听和检测异常是需要代价的,所以应该尽量缩小try catch的范围。
3. catch中要有价值。应该返回以下可操作性的语句,或者返回用户异常时的处理办法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值