java基础之异常处理

1.异常的概念

1.1基本概念

异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。 (开发过程中的语法错误和逻辑错误不是异常)

1.2异常的分类

Java程序在执行过程中所发生的异常事件可分为两类:

  • Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性的代码进行处理。
  • Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理一般有编译时异常(checked)和运行时异常(unchecked)两种。例如:
  1. 空指针访问
  2. 试图读取不存在的文件
  3. 网络连接中断
  4. 数组角标越界

对于这些错误,一般有两种解决方法:一是遇到错误就终止程序的运行。另一种方法是由程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理。 捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生。
比如:除数为0,数组下标越界等
分类:编译时异常和运行时异常

1.3运行时异常

是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该积极避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常。
对于这类异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。
2.编译时异常
是指编译器要求必须处置的异常。即程序在运行时由于外界因素造成的一般性异常。编译器要求Java程序必须捕获或声明所有编译时异常。
对于这类异常,如果程序不处理,可能会带来意想不到的结果。

2.异常处理机制

Java采用的异常处理机制,是将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简洁、优雅,并易于维护。

2.1java异常处理的方式

异常的处理常用的是抓抛模型
过程一:“抛”:程序的正常运行的过程中,一旦出现了异常,就会在异常代码出生成一个对应异常类的对象,并将次对象抛出,一旦抛出对象以后,其后的代码不在执行
关于;异常对象的产生:

  1. 系统自动生成异常对象
  2. 手动生成一个异常对象并抛出(throw)
    过程二:“抓”:可以理解为异常的处理方式
  • try-catch-finally
  • throws+异常类型

2.2try-catch-finally的使用

try{
//可能出现的异常
}
catch(异常类型1 变量1)
{
//处理异常的方式1
}
catch(异常类型2 变量2)
{
//处理异常的方式2
}
catch(异常类型3 变量3)
{
//处理异常的方式3
}
....
finally{
//一定会执行的代码
}
说明:
1.finally是可选的
2.使用try是将可能出现的异常代码包装起来,在执行的过程中,一旦出现的异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配
3.一旦try中的异常对象匹配到某一个catch时,就会进入catch中进行异常;处理,一旦处理完成,就会跳出当前的try-catch结构1(在没有写finally的情况下)
4.catch中异常类型如果没有子父类关系,则谁声明在上,谁声明在下都无所谓
catch中异常类型如果满足子父类关系,则子类一定要声明的父类上面。否则报错
5.常用的异常对象方式:1. String getMessage()  2.printStackTrace()
6.try中声明的变量,再出了try结构以后,就不能在被调用了
7. try-catch-finally可以相互嵌套
8. 使用try-catch-finally处理编译时异常,在编译时可能不会报错,但在运行时仍可能报错(相当于我们使用try-catch-finally是一个编译时可能出现的异常,延迟到运行时出现)
9.
开发中,由于运行时异常比较常见,所有通常我们不针对运行时异常编写try-catch-finally,针对编译时异常,我们一定要考虑异常的处理

2.3 try-catch-finally中finally的使用

  1. finally是可选的
  2. finally中声明的是一定会被执行的代码,即使在catch中又出现了异常,try中有return语句,catch中有return的情况
  3. 不论在try代码块中是否发生了异常事件,catch语句是否执行,catch语句是否有异常,catch语句中是否有return,finally块中的语句都会被执行。
  4. 像数据库连接,输入输出流、网络编程socket等资源。JVM是不能自动回收的,需要我们自己动手;进行资源的释放,此时资源的释放;需要声明的finally中

2.4throws+异常类型

  1. throws+异常类型写在方法的声明处。指明该方法执行时可能会抛出的异常,一旦当方法执行时,出现异常,仍会的异常代码处生成一个异常类对象,此对象满足throws后面的异常类型时,就会被抛出,不对异常进行处理,由方法的调用者进行处理,异常后续的代码就不会执行
  2. try-catch-finally:真正的将异常处理掉
  3. throws之会将异常抛给方法的调用者,并没有真正的将异常处理掉

2.5开发中如何选择使用try-catch-finally还是使用throws

  1. 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写父类的方法中有异常,必须使用try-catch-finally方式进行处理
  2. 执行的方法a中,先后有调用了另外的几个方法,这个方法是递进关系执行的,建议这几个方法使用throws方式进行处理,而执行的方法a可以考虑使用try-catch-finally方式进行处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值