当前位置: 首页 > news >正文

异常的注意事项

一.多个异常使用捕获又该如何处理呢?

1.多个异常分别处理

// 1.多个异常分别处理
try {
    int[] arr = {1, 2, 3};
    System.out.println(arr[3]); // 数组索引异常
}catch(ArrayIndexOutOfBoundsException e){
    e.printStackTrace();
}
System.out.println("后续代码1");
try{
    List<Integer> list = new ArrayList<>(); // 抽象类不能实例化,多态写法
    Collections.addAll(list,1,2,3); // 多添加
    System.out.println(list.get(3)); // 列表索引越界异常
}catch(IndexOutOfBoundsException e){
    e.printStackTrace();
}
System.out.println("后续代码2");

2.多个异常一次捕获,多次处理

try{
    int[] arr = {1, 2, 3};
    System.out.println(arr[3]); // 数组索引异常
    List<Integer> list = new ArrayList<>(); // 抽象类不能实例化,多态写法
    Collections.addAll(list,1,2,3); // 多添加
    System.out.println(list.get(3)); // 列表索引越界异常
}catch(ArrayIndexOutOfBoundsException e){ // 数组越界
    e.printStackTrace();
}catch(IndexOutOfBoundsException e){ // 列表越界
    e.printStackTrace();
}
System.out.println("后续代码3");

一个try多个catch注意事项:

catch里边定义的异常变量,如果有子父类关系,那么子类的异常变量必须写在上边,否则就会报错。(有运行优先级,从上到下一次赋值给catch中定义的异常变量)

3.多个异常一次捕获一次处理

// 3.多个异常一次捕获一次处理
try{
    int[] arr = {1, 2, 3};
    System.out.println(arr[3]); // 数组索引异常
    List<Integer> list = new ArrayList<>(); // 抽象类不能实例化,多态写法
    Collections.addAll(list,1,2,3); // 多添加
    System.out.println(list.get(3)); // 列表索引越界异常
}/*catch(ArrayIndexOutOfBoundsException e){ // 数组越界
    e.printStackTrace();
}*/catch(IndexOutOfBoundsException e){ // 集合越界,选用父类
    e.printStackTrace();
}
System.out.println("后续代码4");

实际上运行时异常被抛出可以不处理,即不声明也不捕获,默认会给JVM处理,打印信息,终止程序。

二.finally有return语句

如果finally有return语句,返回的永远是finally中的结果,避免该情况。

public static void main(String[] args) {
    int a = getA();
    System.out.println(a); // 100
}
//定义一个方法,返回变量a的值
public static int getA(){
    int a = 10;
    try{
        return a;
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        // 一定会执行的代码
        a = 100;
        return a;
    }
}

三.子父类异常

注意:父类异常是什么样,子类异常就什么样

如果父类抛出多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。

public class Fu {
    public void show01() throws NullPointerException,ClassCastException{}
    public void show02() throws IndexOutOfBoundsException{}
    public void show03() throws Exception{}
}
class Zi extends Fu{
    // 子类重写父类方法时,抛出和父类相同的异常
    public void show01() throws NullPointerException{}
    // 子类重写父类方法时,抛出父类异常的子类
    public void show02() throws ArrayIndexOutOfBoundsException{}
    // 子类重写父类方法时,不抛出异常
    public void show03() {}
}

父类方法没有抛出异常,子类重写父类方法时,也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。

public class Fu {
    public void show04(){}
}
class Zi extends Fu{
    // 父类方法没有抛出异常,子类重写父类方法时,也不可抛出异常。
    // public void show04(){}
    // 此时子类产生该异常,只能捕获处理,不能声明抛出。
    public void show04(){
        // throw new Exception("子类产生编译期异常!"); // 错误,父类没有声明异常,子类也不能
        try{
        }catch(Exception e){}
    }
}

 

相关文章:

  • 自定义异常
  • 进程与线程
  • 线程类以及创建多线程的第一种方式---继承Thread类
  • Thread类的构造方法及常用方法
  • 创建多线程的第二种方式--实现Runable接口
  • Thread和Runnable的区别和匿名内部类方式实现线程的创建
  • 线程安全
  • 数据结构基本概念和术语
  • 线程状态
  • Object类中wait带参方法和notifyAll方法
  • File类
  • 递归(斐波那契数列、类加、累乘、打印多级目录)
  • FileFilter过滤器
  • LeetCode两数之和
  • 稀疏数组
  • css选择器
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • node和express搭建代理服务器(源码)
  • rc-form之最单纯情况
  • Vue 动态创建 component
  • vue中实现单选
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 简单基于spring的redis配置(单机和集群模式)
  • 警报:线上事故之CountDownLatch的威力
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 盘点那些不知名却常用的 Git 操作
  • 实现简单的正则表达式引擎
  • 使用 Docker 部署 Spring Boot项目
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ( 10 )MySQL中的外键
  • (arch)linux 转换文件编码格式
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (LeetCode) T14. Longest Common Prefix
  • (区间dp) (经典例题) 石子合并
  • (四)linux文件内容查看
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)大型网站架构演变和知识体系
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • ******之网络***——物理***
  • .NET Core中Emit的使用
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET大文件上传知识整理
  • @JoinTable会自动删除关联表的数据
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @selector(..)警告提示
  • [ Linux ] Linux信号概述 信号的产生
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • []T 还是 []*T, 这是一个问题
  • [c]统计数字
  • [emacs] CUA的矩形块操作很给力啊
  • [iOS]-网络请求总结