2:异常处理

news2024/12/30 0:07:06

文章目录

  • 一:try catch处理异常
    • 1:原理:
    • 2:catch中如何处理异常
    • **3:try-catch-finally**
    • 4:多重catch
    • 5:异常的分类
    • 6:throw和throws的区别
    • 7:练习题
    • 8:重载和重写的异常
    • 9:自定义异常

一:try catch处理异常

public class Test2 {
    public static void main(String[] args) {
        try{
            Scanner scanner = new Scanner(System.in);
            int a = scanner.nextInt();
            int b = scanner.nextInt();
            System.out.println(a / b);
        } catch (Exception ex) {
            System.out.println("对不起,程序出现异常!");
        }
        System.out.println("最后一句话");
    }
}

1:原理:

把可能出现异常的代码放入try代码块中,然后将异常封装为对象,被catch后面的()中的那个异常对象接收,接收以后:执行catch后面的{}里面的代码,然后try-catch后面的代码,该怎么执行就怎么执行。

详细说一下:

(1)try中没有异常,catch中代码不执行。

(2)try中有异常,catch进行捕获:如果catch中异常类型和你出的异常类型匹配的话:走catch中的代码–》进行捕获, 如果catch中异常类型和你出的异常类型不匹配的话:不走catch中的代码–》没有捕获成功,程序相当于遇到异常了,中断了,后续代码不执行

注意:

(1)try中如果出现异常,然后用catch捕获成功的话,那么try中后续的代码是不会执行的。

(2)如果catch捕获异常成功,那么try-catch后面的代码该执行还是执行没有影响。

2:catch中如何处理异常

package P1.package2;

import java.util.Scanner;

public class Test2 {
 public static void main(String[] args) {
     try{
         Scanner scanner = new Scanner(System.in);
         int a = scanner.nextInt();
         int b = scanner.nextInt();
         System.out.println(a / b);
     } catch (Exception ex) {
         // 处理方法1:什么都不写,什么都不做

         // 处理方法2:输出自定义异常信息
         System.out.println("对不起,程序出现异常!");
         // 处理方法3:打印异常信息
         //      3.1:调用tostring方法,打印异常的类名(全限定路径)
         System.out.println(ex.toString());
         //      3.2: 显示异常描述信息对应的字符串,如果没有就显示null
         System.out.println(ex.getMessage());
         //      3.3::显示异常的堆栈信息:将异常信息捕获以后,在控制台将异常的效果给我们展示出来,方便我们查看异常
         ex.printStackTrace();
         // 处理方法4:抛出异常
         throw ex;
     }
     System.out.println("最后一句话");
 }
}

3:try-catch-finally

【1】在什么情况下,try-catch后面的代码不执行?

(1)throw抛出异常的情况

(2)catch中没有正常的进行异常捕获

(3)在try中遇到return

【2】怎么样才可以将 try-catch后面的代码 必须执行?

只要将必须执行的代码放入finally中,那么这个代码无论如何一定执行。

【3】return和finally执行顺序?

先执行finally最后执行return

【4】什么代码会放在finally中呢?

关闭数据库资源,关闭IO流资源,关闭socket资源。

【5】有一句话代码很厉害,它可以让finally中代码不执行!

[System.exit(0); //终止当前的虚拟机执行](file:///C:/Users/86159/Downloads/System.exit(0);/终止当前的虚拟机执行)

package P1.package2;

import java.util.Scanner;

public class Test2 {
 public static void main(String[] args) {
     try{
         Scanner scanner = new Scanner(System.in);
         int a = scanner.nextInt();
         int b = scanner.nextInt();
         System.out.println(a / b);
         // 终止当前虚拟机执行
         System.exit(0);
         return;
     } catch (Exception ex) {
         // 处理方法1:什么都不写,什么都不做

         // 处理方法2:输出自定义异常信息
         System.out.println("对不起,程序出现异常!");
         // 处理方法3:打印异常信息
         //      3.1:调用tostring方法,打印异常的类名(全限定路径)
         System.out.println(ex.toString());
         //      3.2: 显示异常描述信息对应的字符串,如果没有就显示null
         System.out.println(ex.getMessage());
         //      3.3::显示异常的堆栈信息:将异常信息捕获以后,在控制台将异常的效果给我们展示出来,方便我们查看异常
         ex.printStackTrace();
         // 处理方法4:抛出异常
         throw ex;
     }finally {
         System.out.println("最后一句话");
     }
 }
}

/*
12
4
3
Process finished with exit code 0
*/

/*
ww
对不起,程序出现异常!
java.util.InputMismatchException
null
最后一句话
java.util.InputMismatchException
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextInt(Scanner.java:2117)
	at java.util.Scanner.nextInt(Scanner.java:2076)
	at P1.package2.Test2.main(Test2.java:9)
Exception in thread "main" java.util.InputMismatchException
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextInt(Scanner.java:2117)
	at java.util.Scanner.nextInt(Scanner.java:2076)
	at P1.package2.Test2.main(Test2.java:9)

Process finished with exit code 1

*/

4:多重catch

【1】try中出现异常以后,将异常类型跟catch后面的类型依次比较,按照代码的顺序进行比对,执行第一个与异常类型匹配的catch语句

【2】一旦执行其中一条catch语句之后,后面的catch语句就会被忽略了!

【3】在安排catch语句的顺序的时候,一般会将特殊异常放在前面(并列),一般化的异常放在后面。

先写子类异常,再写父类异常。

【4】在JDK1.7以后,异常新处理方式:可以并列用|符号连接:

在这里插入图片描述

package P1.package2;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test2 {
 public static void main(String[] args) {
     try {
         Scanner scanner = new Scanner(System.in);
         int a = scanner.nextInt();
         int b = scanner.nextInt();
         System.out.println(a / b);
         // 终止当前虚拟机执行
         System.exit(0);
         return;
     } catch (ArithmeticException ex) {
         System.out.println("对不起,除数不可以为0");
     } catch (InputMismatchException ex) {
         System.out.println("对不起,你录入的数据不是int类型的数据");
     } catch (Exception ex) {
         System.out.println("对不起,你的程序出现异常");
     } finally {
         System.out.println("最后一句话");
     }
 }
}

5:异常的分类

【1】层次结构:

在这里插入图片描述

注意:程序中语法错误,逻辑错误 都不属于上面的Error,Exception

一般的Exception默认是检查时异常

【2】检查异常:

处理方式1:try-catch嵌套try-catch

package P1.package2;

public class Test3 {
 public static void main(String[] args) {
     //检查异常:
     try {
         try {
             Class.forName("Test3").newInstance();
         } catch (InstantiationException e) {
             e.printStackTrace();
         } catch (IllegalAccessException e) {
             e.printStackTrace();
         }
     } catch (ClassNotFoundException e) {
         e.printStackTrace();
     }
 }
}

处理方式2:多重catch

package P1.package2;

public class Test3 {
 public static void main(String[] args) {
     //检查异常:
     try {
         Class.forName("Test").newInstance();
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
         e.printStackTrace();
     }
 }
}

处理方式3:throws

package P1.package2;

public class Test3 {
 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
     //检查异常:
     Class.forName("Test").newInstance();
 }
}

6:throw和throws的区别

(1)位置不同:

throw:方法内部

throws: 方法的签名处,方法的声明处

(2)内容不同:

throw+异常对象(检查异常,运行时异常)

throws+异常的类型(可以多个类型,用,拼接)

(3)作用不同:

throw:异常出现的源头,制造异常。 (出现问题就地解决)

throws:在方法的声明处,告诉方法的调用者,这个方法中可能会出现我声明的这些异常。然后调用者对这个异常进行处理:要么自己处理要么再继续向外抛出异常。(出现问题先不解决而是甩锅,甩给方法的调用着)

7:练习题

package P1.package2;

public class Test4 {
    // 属性
    private String name;
    private int age;
    private String sex;
    // 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) throws Exception {
        if(sex == "男" || sex == "女") {
            this.sex = sex;
        }else {
            // 制造运行时异常
            //throw new RuntimeException("性别不对!");
            // 制造检查异常
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 甩锅法
            throw new Exception();
        }
    }

    @Override
    public String toString() {
        return "Test4{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }

    public Test4() {
    }

    public Test4(String name, int age, String sex) throws Exception {
        this.name = name;
        this.age = age;
        /*
        try {
            this.setSex(sex);
        } catch (Exception e) {
            e.printStackTrace();
        }
        */
        this.setSex(sex);
    }

    //内部类
    static class text5 {
        public static void main(String[] args) throws Exception {
            Test4 t1 = new Test4();
            try {
                t1.setSex("sdasd");
            } catch (Exception e) {
                e.printStackTrace();
            }
            Test4 t2 = new Test4("asd",10,"sdas");
        }

    }
}

8:重载和重写的异常

【1】重载:

没啥关系

在这里插入图片描述

【2】重写:

子类 <= 父类

在这里插入图片描述

9:自定义异常

在这里插入图片描述

如果继承的是运行时异常,那么在使用的时候无需额外处理

如果继承的是检查异常,那么使用的时候需要try-catch捕获或者throws向上抛

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言-【指针三】-【野指针】

我又来了&#xff0c;勤奋博主上线啦&#xff0c;哈哈哈。本篇文章呢&#xff0c;主要简单介绍一下指针中野指针的相关知识。 野指针 那在对它进行深入了解时&#xff0c;先得知道什么叫野指针吧&#xff0c;那什么是野指针呢&#xff1f; 野指针就是&#xff1a;指向的内存地…

An illegal reflective access operation has occurred警告

问题描述 今天 在 install Maven项目的时候&#xff0c;控制台出现警告如下&#xff1a; WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.thoughtworks.xstream.core.util.Fields (file:/E:/DevelopmentKit/Maven/…

【送书福利-第六期】Java诞生日,推荐Java“此生错过必遗憾”系列书单

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、推荐书籍三、抽奖方…

三维电子沙盘虚拟数字沙盘开发教程第9课

三维电子沙盘虚拟数字沙盘开发教程第9课 查询面板调用&#xff1a; private void Button_Click_11(object sender, RoutedEventArgs e) { GisLib.MapSech _Sech new MapSech(); //查询面板 Root.Children.Add(_Sech); Canvas.Se…

docker可视化管理工具portainer忘记密码重置教程

目录 前言&#xff1a; 1 停止portainer容器 2 借助仓库 portainer/helper-reset-password 重置密码 3 重新启动portainer容器 4 验证是否修改成功 5 修改登录密码 前言&#xff1a; 由于学习的深入&#xff0c;各种账号密码实在是太多了&#xff0c;建议各位配置账号密…

python+django在线借阅图书管理系统vue

本论文是以构建图书借阅为目标&#xff0c;使用 django框架制作&#xff0c;由系统前台、读者和管理员三大部分组成。着重论述了系统设计分析&#xff0c;系统的实现&#xff08;读者注册模块&#xff0c;读者登录&#xff0c;读者浏览图书模块&#xff0c;图书借阅模块&#…

keepalived脑裂后,近20min不能访问虚拟IP问题分析

问题现象和说明 真实的场景比较复杂&#xff0c;抽象起来可以用下面的图表示&#xff0c; #mermaid-svg-OmKwPLsGwcVuYnha {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OmKwPLsGwcVuYnha .error-icon{fill:#5522…

充分发挥C/C++test的价值(上)

对于开发测试来说&#xff0c;最有效的环境就是能够深度集成到开发人员IDE中的统一测试解决方案。例如&#xff0c;团队可能会将测试工作集中在最近更新的、高风险的代码上&#xff0c;而Parasoft C/Ctest这样的集成工具就是最合适的解决方案。 软件验证和确认&#xff08;Ver…

Vulkan Tutorial 5 顶点缓冲区

目录 16 顶点缓冲区 顶点着色器 顶点数据 管道顶点输入 17 顶点缓冲区创建 缓冲区创建 内存要求 内存分配 填充顶点缓冲区 18 暂存缓冲区 传输队列 使用暂存缓冲区 19 索引缓冲区 索引缓冲区创建 使用索引缓冲区 16 顶点缓冲区 我们将用内存中的顶点缓冲区替换…

vue-admin-template框架搭建及应用

一、框架介绍 vue-admin-template是基于vue-element-admin的一套后台管理系统基础模板&#xff08;最少精简版&#xff09;&#xff0c;可作为模板进行二次开发&#xff1b; 可以把 vue-element-admin当做工具箱或者集成方案仓库&#xff0c;在 vue-admin-template 的基础上进…

FPGA基于AXI 1G/2.5G Ethernet Subsystem实现千兆UDP通信 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案传统UDP网络通信方案本方案详细设计说明UDP层设计AXIS-FIFOAXI 1G/2.5G Ethernet Subsystem&#xff1a;输出 4、vivado工程详解5、上板调试验证并演示系统配置UDP数据回环测试注意事项 6、福利&#xff1a;工程代码的获取 1…

SpringMVC第七阶段:SpringMVC的增删改查(01)

SpringMVC的增删改查 1、准备单表的数据库 drop database if exists springmvc;create database springmvc;use springmvc; ##创建图书表 create table t_book(id int(11) primary key auto_increment, ## 主键name varchar(50) not null, ## 书名 author varchar(50) no…

敏捷缺陷「bug」跟踪管理

一般情况下&#xff0c;当前迭代的缺陷&#xff0c;建议放到本迭代的迭代看板上&#xff0c;在迭代结束前修复完成。 “缺陷看板”通常存放发布后遗留的缺陷&#xff0c;客户反馈的缺陷&#xff0c;生产环境发现的缺陷等。 在Leangoo领歌的敏捷项目中&#xff0c;默认创建了“…

安科瑞能源管理系统基于物联网技术应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘 要:在能源形势紧张的大趋势下,高能耗的大型公共建筑能源管理系统的建设逐渐受到重视,以物联网技术及基础的建筑能源管理平台可以提供即时、准确、高效的能源管理策略。 系统阐述了结合物联网技术的建筑能源管理构建…

关于自动映射在项目中的具体落地(dozer)

关于自动映射在项目中的具体落地&#xff08;dozer&#xff09; 项目开发过程中&#xff0c;经常需要编写model之间的转换&#xff0c;最常见的有&#xff1a; 实体转DTODTO转实体 等操作,故为了简化代码的开发工作&#xff0c;需要简化对象属性之间复制的步骤&#xff0c;目…

分类、标签设计及查询优化

文章目录 问题分类和标签的设计知名开源系统的设计jive论坛Solo博客系统的设计wordpress的数据库设计 参考链接 问题 在很多业务系统中&#xff0c;都有对对象的分类和标签设计。在数据库层面如何设计相应的表&#xff0c;以及如何做查询优化&#xff0c;是一个比较普遍的问题…

MKS SERVO4257D 闭环步进电机_系列5 CAN指令说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&am…

客户案例 | 思腾合力GPU算力节点助力实时云渲染

客户介绍 平行云是国内领先的云化XR概念倡导者与技术先行者&#xff0c;LarkXR是平行云研发的云化XR PaaS平台。LarkXR能够帮助XR领域企业级客户快速实现技术、产品及平台的云化转型&#xff0c;高效使能企业的云化XR业务&#xff0c;有效保护客户的内容安全&#xff0c;让多种…

ANDEAWELL:国产工业RFID替代潮即将到来!

受这两年国外的芯片供应不足&#xff0c;价格上涨后用户难以承受等影响&#xff0c;越来越多的企业选择国产替代芯片。随着国产替代芯片的应用增加&#xff0c;东信源芯、旗连、国芯物联等出货量也开始增加&#xff0c;可以预见的是&#xff0c;国产工业RFID替代潮即将到来! 国…

解决Maven 依赖下载不全的问题 (自测有效)

问题描述&#xff1a;从仓库拉代码下来 发现存在部分依赖下载不了。 解决方案&#xff1a;去中央仓库一个个手动下载。具体步骤如下 1.清除下载一般的依赖 &#xff08;以下代码是 .bat 文件&#xff09; echo off rem create by NettQunrem 这里写你的仓库路径 s…