当前位置:   article > 正文

Java异常类型及处理_列举4个java异常类及其解决方法

列举4个java异常类及其解决方法

一、什么是异常

定义:
在程序运行过程中出现的错误,称为异常。异常就是程序运行过程中出现了不正常现象导致程序的中断
在Java中,把各种异常现象进行了抽象形成了异常类

二、异常的分类

2.1异常的类结构图

 2.2异常的分类

异常主要分为:错误、非运行时异常(检查异常)、运行时异常(非检查异常)

错误:程序在运行时发生的非人为的难以避免,并且不好解决的特殊情况,最典型的Error的异常是:OutOfMemoryError

非运行时异常:是指程序编写的过程会出现一些安全的隐患,一些异常需要检查,而这些需要检查的异常就是非运行时异常 –也被叫做检查异常

运行时异常:程序员人为性的代码上的错误,这种系统异常可以处理也可以不处理,所以编译器不强制用try…catch处理或用throws声明

3、异常的处理方式

运行时异常(非检查异常)不需要预处理,通过规范的代码可以避免产生这种异常
非运行时异常(检查异常)必须预处理,否则编译报错,有三种预处理方式 :

  • 捕获异常
  • 抛出异常
  • 声明异常

3.1 捕获异常

3.1.1 try,catch,finally

异常的捕获通常使用try和catch来处理,具体格式如下

  1. try {
  2. }catch(Exception e){
  3. }finally{
  4. }
  •  try中包含了可能产生异常的代码
  • catch可有一个或多个,catch中是对异常的处理
  • 当try中的代码出现异常时,出现异常下面的代码不会执行,马上会跳转到相应的catch语句块中,如果没有异常不会跳转到catch中
  • finally表示,不管是出现异常,还是没有出现异常,finally里的代码都执行,finally和catch可以分开使用,但finally必须和try一块使用

3.1.2 异常捕获处理

  1. try {
  2. //1、对可能产生异常的代码进行检视
  3. //2、如果try代码块的某条语句产生了异常, 就立即跳转到catch子句执行, try代码块后面的代码不再执行
  4. //3、try代码块可能会有多个受检异常需要预处理, 可以通过多个catch子句分别捕获
  5. } catch (异常类型1 e1) {
  6. //捕获异常类型1的异常, 进行处理
  7. } catch (异常类型2 e1) {
  8. //捕获异常类型2的异常, 进行处理
  9. //如果捕获的异常类型有继承关系, 应该先捕获子异常再捕获父异常
  10. } finally {
  11. //不管是否产生了异常, finally子句总是会执行
  12. //一般情况下, 会在finally子句中释放系统资源
  13. }

代码演示

  1. public void Test1(){
  2. int i=100;
  3. int j=0;
  4. //try里是可能出现异常的代码
  5. try {
  6. //当出现被0除异常时,程序流程会执行到“catch(Exception e)”语句,这里是运行是异常,编译可以通过
  7. //被0除表达式以下的语句永远不会执行
  8. int c=i/j;
  9. System.out.println(c);
  10. }catch(Exception e){
  11. // 当有异常发生的时候,catch块被执行
  12. //当没有异常发生的时候 catch块就不执行了
  13. System.out.println("123");
  14. e.printStackTrace();
  15. }
  16. }

测试结果

 3.1.3 异常的捕获顺序


异常的捕获:一般按照由小到大的顺序,也就是先截获子异常,再截获父异常

将Exception放到前面,会出现编译问题,因为Exception是NullPointerException的父类,所以截获了Exception异常后,Exception的子异常都不会执行到,所以再次截获NullPointerException没有任何意义

正确的顺序:

  1. try {
  2. int c=i/j;
  3. }catch(NullPointerException e){
  4. }catch (Exception e){
  5. }
  6. }

3.2 抛出异常

抛出异常使用的关键字throw,写在方法里,在捕获一个异常前,必须有一段代码先生成异常对象并把它抛出。这个过程我们以手工做,也可以由JRE来实现,但是他们调用的都是throw子句。

具体示例如下

  1. public void Test1(String pwd){
  2. if (pwd.length()>=6 && pwd.length()<=18){
  3. System.out.println("改密码合格");
  4. }else
  5. throw new IllegalArgumentException("改密码小于6位或大于18位");
  6. }

测试结果

 3.3 声明异常

 3.3.1 声明异常的用法

声明异常的关键字throws,使用在方法名的后面,用于声明该方法可能会产生一个异常

如果方法声明的是Exception类型的异常或者是非运行时异常,要求方法的调用处必须做处理。

  1. 继续使用throws向上(方法的调用处)声明
  2. 使用try-catch-finally进行处理

如果声明的是RuntimeException类型的异常,那么方法的调用处可处理可不处理。

3.3.2 继承关系中的声明异常

父类的方法声明了Exception类型的异常,子类在重写方法时,可以声明也可以不声明。但是如果子类重写后的方法使用super关键字调用父类的方法,那么要求必须对异常进行处理。

如果父类的方法没有异常,那么子类的方法如果一定会有Exception或Checked异常,要求子类必须自己使用try-catch处理,或者给父类方法加上异常的声明

如果子类在重写父类的方法时,产生的异常是RuntimeException异常时,那么可以不用处理
 

四、补充

4.1 throw 和 throws 的区别

throw
throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。

throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。

throw一般用于抛出自定义异常。

throws
throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。

throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。

throws表示出现异常的一种可能性,并不一定会发生这种异常。

4.2 当try-catch-finally中分别有return 时的执行顺序

  1. try块中有return关键字时 如果没有finally 则直接返回
  2. try块中有return 关键字 catch块也有return 如有有异常时则作走catch块的return
  3. 如果没有异常则走try里的return
  4. 当try块中有return finally中也有return 如果没有异常发生走finally里的return
  5. 当try块中有return  catch也有return finally还有return,没异常按照第3条走,如果有异常 则按照finally中的返回结果执行。

4.3 final、finally、finalize 的区别

final
用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。

finally
异常处理语句结构的一部分,表示总是执行。

finalize
finalize 是Object 类的一个方法,所以Java对象都有这个方法,当某Java对象没有更多的引用指向的时候,会被垃圾回收器回收,该对象被回收之前,由垃圾回收器来负责调用此方法,通常在该方法中进行回收前的准备工作。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用。
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/213889
推荐阅读
相关标签
  

闽ICP备14008679号