Java 异常机制:是Java 提供的一种识别及响应错误的一致性机制。

news2024/11/24 12:08:44


目录

  • 友情提醒
  • 第一章、异常概述
    • 1.1)我们常说的异常是什么
    • 1.2)异常的作用
    • 1.3)Java异常体系和分类
    • 1.4)演示异常的产生
  • 第二章、定义异常与抛出异常:throw
    • 2.1)自定义异常类:继承Exception或RuntimeException
    • 2.2)异常的抛出:throw
  • 第三章、异常处理:throws和try..catch..finally
    • 3.1)异常捕获处理: try..catch..finally(立即处理)
    • 3.2)异常声明处理:throws(延后处理)
    • 3.3)throw和throws的区别
  • 第四章、继承体系下的异常机制
    • 4.1)父类方法没有声明异常,子类重写的方法不能声明编译时异常
    • 4.2)父类方法声明了一个编译异常,子类重写的方法只能声明这个异常或它的子异常

友情提醒

先看文章目录,大致了解知识点结构,直接点击文章目录可以跳转到文章指定位置。

第一章、异常概述

1.1)我们常说的异常是什么

生活中异常举例:异常就是不正常情况,比如汽车运行的时候因为未知原因熄火了,电脑死机了。
在Java中异常 :就是程序出问题了无法得到预期的结果,异常了程序没运行成功。例如:空指针异常、类型转换异常、下标越界异常。
Java异常机制:是 Java 提供的一种识别及响应错误的一致性机制。

1.2)异常的作用

①使程序中异常处理代码和业务代码分离。
②异常机制为我们提供了三类信息包括:
1、异常类型回答了什么被抛出
2、异常堆栈跟踪回答了在哪抛出
3、异常信息回答了为什么会抛出。

1.3)Java异常体系和分类

脑图链接:Java异常体系
在这里插入图片描述
常见的异常:

异常解释
InputMismatchException输入类型不匹配的异常
ArrayIndexOutOfBoundsException用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。
ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时。
ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常。
IllegalThreadStateException线程没有处于请求操作所要求的适当状态时抛出的异常。
IndexOutOfBoundsException指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
NegativeArraySizeException如果应用程序试图创建大小为负的数组,则抛出该异常。
NullPointerException当应用程序试图在需要对象的地方使用 null 时,抛出该异常
NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
StringIndexOutOfBoundsException此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。
ClassNotFoundException应用程序试图加载类时,找不到相应的类,抛出该异常。
IllegalAccessException拒绝访问一个类的时候,抛出该异常。
InstantiationException当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。
InterruptedException线程被另一个线程中断,抛出该异常。
NoSuchFieldException变量不存在
NoSuchMethodException方法不存在

1.4)演示异常的产生

/*
演示异常出现的场景问题:

    运行时异常:算数异常
    java.lang.ArithmeticException: / by zero
 */
    public class TestException {
        public static void main(String[] args) {
            div(10, 0);
        }
        //计算两个整数的商
        public static void div(int a,int b) {
            double num = a / b;
            System.out.println("商为:" + num);
        }

如图因为除数不能为0所以产生了异常:Exception in thread “main” java.lang.ArithmeticException: / by zero
在这里插入图片描述

第二章、定义异常与抛出异常:throw

2.1)自定义异常类:继承Exception或RuntimeException

①自定义编译期异常类需要继承 Exception 类。
②自定义运行时异常类,需要继承 RuntimeException 类。
③异常类同样可以拥有自己的属性和方法。

//自定义异常类
public class MyException extends RuntimeException{
    static final long serialVersionUID = -70348971945766939L;

    //构造方法
    public MyException() {
    }

    public MyException(String message) {
        super(message);
    }
}

2.2)异常的抛出:throw

使用throw 关键字抛出异常,什么是抛出异常呢?
是java中一个程序处理动作。如果一个方法没有使用try…catch捕获可能引发的异常,为了明确指出此方法不捕获这类异常,并且要让调用该方法的其他方法去捕获处理该异常。我们就使用throws明确的抛出(产生)该类异常。

/*
    演示手动抛出异常对象=关键字:throw
 */
public class TestException_5 {
    public static void main(String[] args) {
        People p = new People("张三", 140);
        System.out.println(p);
        //...
    }
}
//------------------------------分割----------------------------
class People{
    private String name;
    private int age;
    public People() { }
    public People(String name, int age) {
        this.name = name;
        //数据合理性的校验
        if (age <= 0 || age > 130) {
//      System.out.println("年龄不合理...");  //打印信息
//      throw new RuntimeException("年龄有误!"); //抛出异常,因为是运行时异常可以处理也可以不处理
//      throw new Exception("年龄有误..."); //抛出异常,因为不是运行时异常所以必须处理
   throw new MyException("年龄有误...");//抛出异常,因为是运行时异常的子类可以处理也可以不处理
        } else {
            this.age = age;
        }
    }
    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;}
    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

第三章、异常处理:throws和try…catch…finally

如果异常一直用throw抛出总不是个事情,异常总得有处理的时候这时候需要用到throws和try…catch…finally
ps:idea中添加try-catch的快捷方式:选中代码 -> ctrl + alt + t

3.1)异常捕获处理: try…catch…finally(立即处理)

①try结构:将可能出现异常的代码定义其中,异常对象出现后,jvm就会调用catch结构尝试捕获处理它。
②catch结构:异常对象出现,jvm会让第一个catch结构尝试捕获处理:,如果类型匹配,则捕获成功,执行catch大括号中的逻辑代码;如果类型不匹配,则捕获失败,则调用下一个catch结构继续尝试捕获…
③try结构中出现了异常对象,被catch结构捕获处理后,try-catch结构内的后续代码不可以被继续执行,try-catch结构以外的后续代码可以继续被执行。
④ 如果多个catch结构涉及的异常类型存在子父类的关系,则类型小的catch必须定义在类型大的catch的上面。
⑤finlly结构,它被定义在最后位置,将一定需要被执行的代码定义在finally的内部,finally中的代码一定会被执行。

案例一: try…catch结构

/*格式: try{
            //可能出现异常的代码
        }catch(异常类型1 对象名){
            //逻辑代码
        }catch(异常类型2 对象名){
            //逻辑代码
        }
 */
public class TestException_3 {
    public static void main(String[] args) {
        test2();
    }

 public static void test2() {
        /*
            运行时异常:数组下标越界异常
                java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
         */
        try {
            int[] arr = new int[10];
            System.out.println(arr[10]);
        } catch (Exception e) {     //参数位置可能发生多态        万能捕获器       表现:Exception e = new ArrayIndexOutOfBoundsException();
            e.printStackTrace();    //打印堆栈信息 ==> 将异常对象所属的类型、原因、涉及的行数打印展示在控制台
//            System.out.println(e.getMessage());       //得到异常出现的原因
        }

        System.out.println("执行了");
    }
}

案例二: try…catch结构

public class TestException_3 {
    public static void main(String[] args) {
        test3();
    }

 public static void test3() {
        /*
            运行时异常:空指针异常
                java.lang.NullPointerException
         */
        try {
            String str = "javase";
            str = null;
            int size = str.length();
            System.out.println("长度为:" + size);
        } catch (NullPointerException e){
            System.out.println("出现空指针异常啦!已经处理完毕...");
        } catch(Exception e) {
            System.out.println("万能捕获器未被触发,因为前面已经触发了空指针异常");
        }
        System.out.println("可以执行了");
    }
}

案例三: try…catch…finally结构中,finlly被定义在最后位置,将一定需要被执行的代码定义在finally的内部,finally中的代码一定会被执行。

/*格式: try{
            //可能出现异常的代码
        }catch(异常类型1 对象名){
            //逻辑代码
        }catch(异常类型2 对象名){
            //逻辑代码
        }finally{
            //定义一定需要被执行的代码
        }
 */
public class TestException_3 {
    public static void main(String[] args) {
        test4();
    }
 public static void test4() {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("hello2.txt");
            int len;
            while ((len = fis.read()) != -1) {
                System.out.println((char) len);
            }
            int num = 10 / 0;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {	//这里面的代码一定会执行
            try {
                if (fis != null) {
                    fis.close(); 
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("执行了");
    }
}

3.2)异常声明处理:throws(延后处理)

Java中声明异常(throw exception):一个方法产生了一个它不想立即处理的异常时,那么就需要在该方法的头部使用throws主动声明这个异常,告诉调用者可能出现问题,后面交给外部进行处理,以达到延后处理的目的。
如下代码:m1方法中的异常最终交给了m3方法解决。

/* 关键字:throws	格式:
        public ... 返回值类型 方法名(形参列表) throws 异常类型1,异常类型2,...,异常类型n{
            //方法体
        }
 */
public class TestException_4 {
    public static void main(String[] args) {
        m3();
    }

    public static void m3(){
        try {
            m2();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void m2() throws IOException {
        m1();
    }

    public static void m1() throws IOException {
        FileInputStream fis = new FileInputStream("hello.txt");
        int len;
        while ((len = fis.read()) != -1) {
            System.out.println((char) len);
        }
        fis.close();
    }
}

3.3)throw和throws的区别

① throw:用来抛出异常的,用于异常对象的产生;
throws:用来声明异常的,用于异常对象的处理;
②通常在一个方法(类)的声明处通过 throws 声明方法(类)可能拋出的异常信息,而在方法(类)内部通过 throw 声明一个具体的异常信息。
③throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。

第四章、继承体系下的异常机制

4.1)父类方法没有声明异常,子类重写的方法不能声明编译时异常

在这里插入图片描述

4.2)父类方法声明了一个编译异常,子类重写的方法只能声明这个异常或它的子异常

在这里插入图片描述

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

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

相关文章

网络io与io多路复用select/poll/epoll

一、网络IO请求 网络I/O请求是指在计算机网络中&#xff0c;向其他主机或服务器发送请求或接收响应的操作。这些请求可以包括获取网页、下载文件、发送电子邮件等。网络I/O请求需要使用合适的协议和通信方式来进行数据传输&#xff0c;例如HTTP、FTP、SMTP等。 要完成一个完整…

字节面试过了,薪资都谈好了20K*13,结果挂在这里....

一般提到面试&#xff0c;肯定都会想问一下面试结果&#xff0c;我就大概的说一下面试结果&#xff0c;哈哈&#xff0c;其实不太想说&#xff0c;因为挺惨的&#xff0c;并没有像很多大佬一样 ”已拿字节阿里腾讯各大厂offer”&#xff0c;但是毕竟是自己的经历&#xff0c;无…

让效果图渲染做到最佳的几个小诀窍

制作出优秀的效果图需要多方面的技术支持&#xff0c;而渲染是其中非常关键的一步。一份精美的效果图需要经过高质量的渲染才能呈现出最佳的效果。本文将分享一些关于如何让效果图渲染做到最佳的小诀窍&#xff0c;包括专注的小细节、优化场景设置和灯光、纹理、图像应用最终修…

医疗电子红外线人体额温枪方案

在当前新冠疫情背景下&#xff0c;红外线人体额温枪成为疫情防控必备的设备之一。红外线人体额温枪采用红外线技术&#xff0c;无需接触人体&#xff0c;通过测量人体表面温度来判断人体是否发热。其测量快速、准确、不接触等特点&#xff0c;使其广泛应用于机场、车站、医院、…

数据结构之二叉树(Java)

在这里先说明一下&#xff0c;结点和节点其实一样的&#xff0c;无须关注这个。 一、树型结构 1. 概念&#xff1a;树是一种非线性的数据结构&#xff0c;它是由n个有限节点组成一个具有层次关系的集合。 如上图所示&#xff0c;把此种数据结构称作树是因为它看起来像一个倒挂…

校园高校教务选课成绩系统node.js+vue

系统主要实现了以下功能模块&#xff1a; 学籍信息 网上选课 网上评教&#xff0c;即对自己老师评分 任务查询&#xff0c;老师可以给学生发布任务&#xff08;类似于作业&#xff0c;考试&#xff09; 课表查询&#xff0c;希望有个图形化的课表&#xff0c;而不是表格式 教室…

Mysql InnoDB的Buffer Pool

Buffer Pool 在MySQL服务器启动的时候就向操作系统申请了⼀⽚连续的内存&#xff0c;他们给这⽚内存起了个名&#xff0c;叫做Buffer Pool&#xff08;中⽂名 是缓冲池&#xff09;。 默认情况下Buffer Pool只有128M⼤⼩&#xff0c;最⼩值为5M&#xff0c;通过修改配置文件设…

【Linux开发—多进程编程】

【Linux开发—多进程编程】 前言1&#xff0c;两种类型的服务端2&#xff0c;并发服务器的实现方法&#xff1a; 一&#xff0c;认识及应用1&#xff0c;进程认识2&#xff0c;CPU核的个数与进程数3&#xff0c;进程ID4&#xff0c;进程创建5, 调用fork函数后的程序运行流程: 二…

一文了解PWA——Progressive Web App

近年来&#xff0c;出现了一种新的应用开发模式——PWA&#xff08;Progressive Web App&#xff0c;即渐进式Web应用&#xff09;。今天就来为大家分享什么是PWA&#xff0c;以及它与小程序的区别、技术原理。 PWA的基本概念和技术原理 PWA是一种基于Web技术的应用开发模式&a…

基于CC2530设计智慧农业控制系统

一、项目背景 智慧农业是近年来发展迅速的领域,其目的是利用先进的传感技术、物联网技术和云计算技术等,实现自动化、智能化的农业生产管理,并提高农业生产效率和质量。本文基于CC2530设计了一种智慧农业控制系统,采用DHT11模块、BH1750模块和土壤湿度传感器等传感器,通过…

turtle和matplotlib画画:圆形、爱心

马上就要到六一儿童节了&#xff0c;小朋友很喜欢画画&#xff0c;这里就用Pyhton来画一些简单形状&#xff1a; 用turtle画圆形 import turtle# 设置画笔颜色和粗细 turtle.pencolor("black") turtle.pensize(5)# 绘制一个半径为100的圆形 turtle.circle(100)# 隐藏…

jsonp的实现原理

什么是跨域&#xff1a; 跨域是浏览器同源策略而产生的&#xff0c;在不同协议&#xff0c;不同端口&#xff0c;不同域名下&#xff08;以上任意一个不同都算是跨域&#xff09;的客服端和服务端之间是无法互相访问的。 举例&#xff1a; http://www.baidu.com/index.html …

Springboot +spring security,前后端分离时的security处理方案(一)

一.简介 在前后端分离这样的开发模式下&#xff0c;前后端的交互都是通过 JSON 来进行数据传递的&#xff0c;无论登录成功还是失败&#xff0c;都不会有服务端跳转或者客户端跳转之类的操作。 也就是说无论登录成功还是失败&#xff0c;服务端都会返回一段登录成功或失败的 …

与传统序列化比,PB更快更节省空间

文章目录 为何选择PBPB安装WindowsMac未完待续 语法命令行编译Maven插件编译UDP通信的例子 3大序列化方法对比 为何选择PB 在网络传输和存储数据的时候比传统的 JSON 效果更好 PB安装 GitHub Windows 下载 配置环境变量 验证 Mac未完待续 后续补充Mac安装方式 语法 使用过…

Word、Excel、PPT题库——“办公自动化”

小雅兰期末加油冲冲冲&#xff01;&#xff01;&#xff01; 1.【单选题】下列文件扩展名,不属于Word模板文件的是&#xff08; A &#xff09;。 A. .DOCX B. .DOTM C. .DOTX D. .DOT 本题的考查点是word基本知识的了解。 .DOCX&#xff1a;word文档。 .DOTM&#xff1a;启…

目标检测:RPN — Faster R-CNN 的主干

动动发财的小手&#xff0c;点个赞吧&#xff01; 在使用 R-CNN 的目标检测中&#xff0c;RPN 是真正的主干&#xff0c;并且到目前为止已被证明非常有效。它的目的是提出在特定图像中可识别的多个对象。 这种方法是由 Shaoqing Ren、Kaiming He、Ross Girshick 和 Jian Sun 在…

Pandas 28种常用方法使用总结

Pandas库专为数据分析而设计&#xff0c;它是使Python成为强大而高效的数据分析环境的重要因素。它提供了多种数据结构和方法来处理和分析数据。下面是一些Pandas常用方法的使用总结。 1. 创建数据框 使用read_csv()或read_excel()方法读取数据文件&#xff0c;也可以使用Dat…

饶派杯XCTF车联网安全挑战赛Reverse GotYourKey

文章目录 一.程序逻辑分析二.线程2的operate方法解析三.找出真flag 一.程序逻辑分析 onCreate方法中判断SDK版本是否>27 然后创建两个线程 第一个线程是接受输入的字符串并发送出去 第二个线程用于接受数据 线程1,就是将字符串转为字节数组发送出去 线程2,作为服务端接受…

knife4j、swagger、springdoc 返回接口分组排序问题

一、直击问题 解决前后顺序对比 解决方法&#xff1a; 在配置文件中添加排序规则方法sortTagsAlphabetically&#xff1a; package com.example.demo.config;import io.swagger.v3.oas.annotations.OpenAPIDefinition; import io.swagger.v3.oas.annotations.enums.Security…

OpenMMlab的整体概述和作用

是什么&#xff1f; 开源算法体系&#xff08;非框架、有开源代码&#xff09; 用pytorch实现 优势 开箱即用&#xff0c;复现了很多顶会论文中的算法。每个cv任务对应算法库&#xff0c;其中顺序即为学习路线。便于对比实验。 使用统一的框架、超参数&#xff0c;做对比实…