20220729 第五小组 罗大禹 学习笔记
作者:互联网
20220729 第五小组 罗大禹 学习笔记
Java 抛出异常
学习重点
1.throw关键字
2.try...catch关键字
学习心得
今天老师上课讲的抛出异常还是很好理解的,感觉自己吸收的还算不错。
学习内容
Java 抛出异常(理解)
异常处理
- 下标越界
- 空指针
- 类型转换异常
- 数字格式化
- 算数异常(数学异常,除数为0)
编程界有三个事情的后果是非常严重的
- 除数为零
- IO流(输入输出流),没有关闭
- 停电(如今还好,以前很严重)
当一个程序抛出异常时,抛异常后面的语句不再执行,类似于return的功能,终止方法的执行。
import java.math.BigDecimal;
public class Ch01 {
public static void main(String[] args) {
int num1 = 10;
int num2 = 0;
//若为double类型,结果为无穷大,因为小数会近似,0是无限接近与0,因此得数会无穷
System.out.println(num1/num2);
BigDecimal bigDecimal = new BigDecimal(1);
BigDecimal bigDecimal1 = new BigDecimal(0);
//BingDecimal不会出现上述问题,会直接抛异常
//抛异常后,结束程序执行
System.out.println(bigDecimal.divide(bigDecimal1));
System.out.println("我很重要");
}
}
异常的继承体系结构
最顶级的异常类Throwable(所有错误和异常的父类)
Error(错误也是类,万事万物皆对象) :
正常情况下,不太可能出现的,绝大多数的Error都会导致程序处于非正常的状态下,很难恢复,
它是在外力的作用下,不考虑(错误一定是代码写错了)。Error是Throwable的子类。它是在Java程序处理范围之外的
Exception:
Java语言中,将程序执行中发生的不正常的情况称之为异常。
编译期异常:
写代码的时候会抛异常。如果编译期不解决,会编译不通过,一直报红
运行期异常:
RuntimeException,运行时会抛异常,平时没什么事
自定义异常:
Java中,异常机制虽然已经很完善了,但是一旦结合实际的业务,还是不够的。例如:年龄为-1
怎么自定义异常?
- 所有的异常必须是Throwable的子类(大材小用,没必要)
- 如果要定义一个编译期异常,需要继承Exception类,就是编译期异常
- 如果要定义一个运行期异常,需要继承RunTimeException类
// 自定义运行期异常类
public class MyRuntimeException extends RuntimeException{
public MyRuntimeException(String message) {
super(message);
}
}
// 测试类
public class Ch03 {
public static void fun(int i ,int j) throws MyException {
if(j==0){
// 若抛出运行期异常使用throw new MyRuntimeException("除数不能为0 ");即可
throw new MyRuntimeException("除数不能为0");
}
System.out.println(i/j);
}
public static void main(String[] args) {
try {
fun(1,0);
}catch(MyRuntimeException myRuntimeException){
myRuntimeException.printStackTrace();
}
}
}
throw:
在程序中可用throw来抛出一个异常
try...catch
catch可以写多个,是有顺序问题的,将范围小的写在上方。
在一个语句块中,如果私用throw抛出一个编译期异常,有两种处理方式
-
在方法的声明处使用throws关键字来标记异常类型
-
使用try...catch来解决异常
public class Ch02 {
public static void main(String[] args) {
int num1 =10;
int num2 =0;
// 处理异常
try {
// 把有可能抛异常的代码放到try语句块里
// 如果出现异常会直接跳到catch,然后继续向下走
System.out.println(num1/num2);
}catch( Exception e/* 类似于形参 */){
System.err.println("除数不能为0");
e.printStackTrace();// 在命令行打印异常信息在程序中出错的位置及原因。
}
// 由于异常被解决,因此会继续执行程序
System.out.println("我很重要");
}
}
finally关键字
finally用来创建在try代码块后面执行的代码块
无论是否发生异常finally中的代码块一定会执行,一般finally中的代码是用来释放资源
无论catch抓没抓住异常,都会走finally
若有return,运行顺序为
try--catch--finally--return
try {
throw new RuntimeException();
}catch(RuntimeException runtimeException) {
System.out.println("运行异常");
}finally {
System.out.println("啦啦啦")
}
我们为什么要手动抛异常?
因为要配合全局异常处理机制来解决问题
public class Ch03 {
public static void fun(int i ,int j) throws MyException {
if(j==0){
//若抛出运行期异常使用throw new MyException("除数不能为0 ");即可
throw new MyException("除数不能为0");
}
System.out.println(i/j);
}
public static void main(String[] args) {
try {
fun(1,0);
}catch(MyException e){
e.printStackTrace();
}
}
}
异常链
一个异常被抛出去之后会被继续调用这个方法的方法捕获或抛出
方法的重写(补充)
-
方法的重写不能抛出必被重写方法更大的异常类型
标签:20220729,System,笔记,try,println,大禹,catch,异常,public 来源: https://www.cnblogs.com/ldydj/p/16534944.html