java 异常处理

目录

1.异常类的继承关系
    检查性异常
    非检查性异常
2.异常处理机制
   try、catch、finally语句
   throw、throws关键字
3.自定义异常类


 

1.异常的定义

运行期间出现的错误,而不是编译时的语法错误
例如,

  • 打开一个不存在的文件
  • 网络连接中断
  • 操作数组越界等

 

  •  Error类特指应用程序在运行期间发生的严重错误。如:虚拟机内存用尽、堆栈溢出等等。一般情况下这种错误都是灾难性的,所以没有必要使用异常处理机制处理Error
  • Exception类有几十个子类,描述了不同类型的异常,其中:以RuntimeException为代表的一些类,称为非检查性异常(uncheckedException),
    以IOException为代表的一些类为检查性异常(checked Exception)。所谓的检查和非检查是指编译器在编译时是否检查。如果代码中存在检查性异常,必须进行异常处理,否则编译时不能通过;而非检查性异常编译时不进行
    检查,到运行时才会显现。

 2.异常类型

  •  检查性异常(checked exception)
    若系统运行时可能产生该类异常,则必须写出相应的处理代码,否则无法通过编译非RuntimeException异常
  • 非检查性异常(unchecked exception)若系统运行时可能产生该类异常,则不必在程序中声明对该类异常的处理,
    就可以编译执行RuntimeException:运行时异常 

3.Java为何分别处理这两类异常?

  • 般我们不在 代码中处理非检查性异常,这类异常都在运行时抛出。原因主要是由于程序员经验不足或是思维不缜密造成。如:数组越界异常(ArrayIndexOutOfBoundsException)、整数除以0异常(ArithmeticException)等,这类异常其实就是我们通常说的bug。所以,这类异常应通过反复测试尽量避免,而不应该靠异常处理机制来解决。
  • 检查性异常不同,就算程序员再有经验,也是难以避免。如:用户连接数据库的异常(SQLException),如果是由于数据库服务器没有启动或是网络中断引起的,我们程序员是无法避免的。又如:程序要读取光盘中的文件,而用户忘记插入光盘,此时则抛出文件没找到异常(FileNotFoundException),程序员也无法避免。

 

 

2.异常处理机制

4.try…catch语句

 

catch块,是用来捕获并处理try块抛出的异常的代码块。没有try
块,catch块不能单独存在。我们可以有多个catch块,以捕获不
同类型的异常 

 

  •  如果程序抛出多个不同类型的异常,我们需要多个catch()语句来处理
  • 和特殊异常类相关联的catch()块必须写在和普通异常类相关联的catch()之前

 

 5.异常处理机制

  • 每次try块有异常抛出,系统会试着从上到下往每个catch块中传参,直到遇到一个类型匹配的catch块为止
  • 如上示例中最后一个catch块中的形参为Exception类型,它是所有异常类的父类,任何异常都可以传参到该块中,该块可以处理任何类型的异常。因此,这个catch块只能放到最后面,否则所有的异常都被它处理了,其他的catch块就不能分门别类的起作用了

 

6.finally异常处理

  • finally语句放在try …catch语句后
  • fianlly语句中的代码块不管异常是否被捕获总是要执行
  • 通常在finally语句中可以进行资源的清除操作,如:关闭打开文件、删除临时文件
  • 对应finally代码中的语句,即使try代码块和catch代码块中使用了return语句退出当前方法或般若break跳出某个循环,相关的finally代码块都有执行。
  • 当try或catch代码块中执行了System.exit(0)时,finally代码块中的内容不被执行

7.throws关键字

  • 如果一个方法中的语句执行时可能生成某种异常,但是并不能确定如何处理,则可以在程序所在的函数声明后,使用throws关键字抛出异常

8.throw语句

  • 异常是通过关键字throw抛出,程序可以用throw语句引发明确的异常
  • throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。不能单独使用,要么和try.. catch…一起使用,要么和throws一起使用
  • throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象

9.方法调用堆栈

  • 后进先出:方法A调用方法B的时候,只有方法B先完成后,方法A才完成。先执行的方法总是后完成,后执行的方法先完成,类似于数据结构中的堆栈--后进先出,我们称之为方法调用堆栈 。

3.自定义异常类

  • 如果Java提供的异常类型不能满足程序设计的需要,我们可以定义自己
  • 用户自定义的异常类应为 Exception 类(或者Exception 类的子类)的子类

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值