异常与异常处理

前言

本文为华为开发者学堂-面向对象编程的课程笔记,仅供个人学习使用。

异常与异常处理

什么是异常和异常处理

异常:异常是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。在Java中,它是一种特殊的对象,类型为java.lang.Exception或其子类
如何解决呢?

  • 程序员通过代码堵住程序可能出现的漏洞
  • 程序员在设计程序的阶段预测可能出现的异常并写好对应措施,当程序遇到这些异常时,会按照事先规定好的代码去处理异常而不含让程序中断运行
  • IDE和编程语言提供的异常处理机制(标红,报错等等)

异常处理机制

  • Java的异常处理是通过try、catch、finally、throw和throws五个关键字来完成的,try执行可能产生异常的代码,catch捕获异常,无论是否发生异常,finally中的代码总能执行,throws声明方法可能要抛出的各种异常,throw手动抛出异常
  • Java内的异常Exception是一个,catch要捕获的是Exception类的对象
    • 常见的异常类型
      • Exception:异常层次结构的父类
      • ArithmeticException:算术错误
      • InputMismatchException:输入格式不匹配 (比如要求输入int但得到字符串)
      • ArrayIndexOutOfBoundsException:数组下标越界
      • NullPointerException:尝试访问null对象成员 (比如你将一个字符串用equals()跟指向null的字符串比较)
      • ClassNotFoundException:不能加载所需的类 (比如打错类名了)
      • lllegalArgumentException:方法接收到非法参数
      • ClassCastException:对象强制类型转换错误
      • NumberFormatException:数字格式转换异常 (比如把“abc”转换成数字)
  • 在catch块中处理异常:
    • 使用**System.err.println()**来输出错误反馈信息
    • 使用**e.printStackTrace()**来输出异常的堆栈信息并跟踪异常产生的位置和过程
    • 使用**e.getMessage()**得到描述异常的字符串,而该字符串是printStackTrace()输出信息的一部分,如果异常没有描述字符串则输出null
  • 关于多重catch块
    • 排列catch语句的顺序:先子类后父类
    • 发生异常时按顺序逐个匹配
    • 只执行第一个与异常类型匹配的catch语句

try-catch-finally

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//使用try-catch-finally处理、捕捉异常,分为三种情况:
public void method(){
try{
//可能产生异常的代码块
}
catch(异常类型 ex){
//对异常进行处理的代码段
}
finally{
//无论如何都会执行的代码段,除了极个别情况
}
}
//第一种情况:无事发生,执行顺序:try——>finally(跳过catch)
//第二种情况:产生可以处理的异常:try(try内产生异常的行后面的代码不会被执行)——>catch——>finally(除非catch内的处理方法里有退出Java虚拟机方法System.exit(1),否则继续)
//第三种情况:产生异常类型不匹配:try——>产生的异常会和catch的异常类型进行匹配,如果不匹配则中断运行,但是一定会在中断之前执行finally

使用throws声明异常

如果一个方法体可能抛出异常,我们使用throws声明可能抛出的各种异常,异常之间用逗号隔开
调用者的对应方式有:

  • 处理异常
  • 继续声明异常,比如a方法声明了异常,调用它的b方法不解决异常,可以继续声明a的异常,由于这些方法最后都会回到main方法,所以如果这些方法都不解决异常,就交给虚拟机处理 main方法声明的异常由Java虚拟机处理

使用throw抛出异常

写法见以下代码

1
throw new 某类型Exception("异常信息");//当使用throw显式抛出异常,必须对异常处理,或throws声明异常
throw throws
生成并抛出异常 声明方法内抛出了异常
位于方法体内部,可作为单独语句使用 必须跟在方法参数列表后面,不能单独使用
抛出一个异常对象,且只能是一个 声明抛出异常类型,可以用来一次声明多个异常类型

注意

  • 如果在try和catch中遇到return,先执行finally,再执行return
  • try\catch\finally可以任意组合, 但必须有try,catch和finally至少出现一个
  • 如果方法内产生异常却不在方法内处理 有throw但没有catch,就必须使用throws声明该异常

异常体系结构

我们注意到,Exception对象的直接父类是Throwable类,而Throwable类除了Exception类这个直接子类外,还有一个直接子类叫Error。Error为仅靠程序本身无法恢复的严重错误,代表Java虚拟机的底层问题(比如AWTError (发生严重的Abstract Window Toolkit错误时抛出)、线程意外终止ThreadDeath等、内存溢出OutOfMemoryError)而Exception为由Java应用程序抛出和处理的非严重错误。而Exception又进一步可细分为Checked异常和运行时异常RuntimeException,Checked异常在编译时会被检查出来,程序必须处理该类异常,如ClassNotFoundException、ClassCastException等。RuntimeException表示该异常为运行时可能出现的异常,在编译时不会检查的异常,不要求程序必须做出处理,如ArithmeticException算术异常、调用null对象异常NullPointerException等,这些异常一般是由程序的逻辑错误引起的。

自定义异常

异常链与异常处理原则

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022 Daniel Qi
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信