[java进阶]——异常详解,try catch捕获异常,抛出异常

news2024/11/22 17:28:08

🌈键盘敲烂,年薪30万🌈

目录

一、异常的体系结构

二、处理异常的本质

三、异常处理的三种方式

3.1虚拟机jvm处理(默认)

3.2 try catch捕获异常

3.3抛出异常

 3.4finally关键字

四、自定义异常

五、总结


一、异常的体系结构

 分析:

Error:表示JVM无法恢复的严重错误的Throwable子类。这些错误通常是由于系统资源不足、类文件损坏或其他无法控制的情况下发生的。例如,OutOfMemoryError表示JVM无法分配所需的内存量;StackOverflowError表示JVM在执行无限递归时耗尽了堆栈空间。

Exception:Throwable的另一个子类,表示程序可能能够处理的异常情况。按类分为编译异常和运行异常

Error我们无法处理

Exception异常处理方式有三种:1.默认交给虚拟机处理 2.捕获异常 3.抛出异常

二、处理异常的本质

一句话:提高健壮性与可靠性

你想,如果你想录入一个年龄,你要进行合法值判断,否则你就可能出现活了18.4年,-10年这样的情况,而编译器会认为这个年龄是正确的,继续运行后面的程序会发生意想不到的后果,只不过这些异常是其他形式的异常,例如数组越界,空指针,文件不存在等等。

运行异常:运行异常通常是由程序员自身编写代码不规范引起的,比如数组越界、空指针。这些异常通常我们不会捕获,因为这些异常时可以通过提升你的代码质量来消除的。

编译异常:编译时发生的异常,通常是程序员的错误,或者外部环境错误,例如变量没定义就使用,没有找到你要引用的库文件等等,这些异常通常使用try catch捕获或抛出。

三、异常处理的三种方式

3.1虚拟机jvm处理(默认)

将异常信息打印到控制台,并直接终止程序。

3.2 try catch捕获异常

原理分析

try代码块里发生异常会自动创建一个异常对象,不会执行try代码块中异常后面的代码,直接到catch里面寻找,如果catch捕获了该异常,就执行catch里面的代码,再执行try-catch后续代码,如果没有捕获,交给虚拟机处理(第一种方式)。

注意:异常可以被继承,所以捕获父类异常一定要写到最后

try-catch的灵魂四问:

一问:如果try中没有遇到问题,会怎么执行

二问:如果try中遇到多个问题,怎么执行

三问:如果try中遇到问题没有被捕获,怎么执行

四问:如果try中遇到了问题,那么try后的代码还会执行吗

上才艺:

try中没有遇到问题,会执行try-catch后面的代码

try遇到多个问题,会处理第一个异常(找catch),并且try后面的代码不会执行,如果没有捕获交给虚拟机处理

应用场景:

 try{
            System.out.println(arr[4]);//数组越界
            //System.out.println("aaaaaaa");
            int a = 10/0;//算数异常
        }catch (IndexOutOfBoundsException e){
            System.out.println("索引越界异常");
        }catch (ArithmeticException e){
            System.out.println("除数不能为0");
        }catch (NullPointerException e){
            System.out.println("空指针异常");
        }catch (Exception e){
            //异常的父类 一定要放到最后,
            //如果放到了前面
            //什么异常都会被捕获
            System.out.println("发生异常~~");
        }
        System.out.println("看看我执行了嘛~~");

3.3抛出异常

throw:写在方法内,结束方法,后续代码不会执行,告诉调用者是什么异常

throws:写在方法定义处,表示声明一个异常,告诉调用者,该方法可能出现哪些异常

编译异常必须要写,运行异常可以不写

 private static int getSum(int[] arr) throws NullPointerException {
        //可能为null指针吧
        if(null == arr){
            //抛出异常 结束方法 不会执行下面的语句
            throw new NullPointerException();
        }
        System.out.println("看看我执行了嘛~~");
        //正常计算求和
        int total = 0;
        for (int i = 0; i < arr.length; i++) {
            total += arr[i];
        }
        return total;
    }

 抛出问题的三种方法:

1.getmessage,返回throwable字符串

2.throw e 抛出异常

3.e.printStackTrace()将错误以红色字体打印在控制台 最常用

int[] arr = {1,2,3};
        try {
            arr[6] = 10;
        } catch (ArrayIndexOutOfBoundsException e) {
//            //getmessage方法 返回 throwable 消息字符串
//            String message = e.getMessage();
//            System.out.println(message);

//            tostring返回问题的简短描述
//            System.out.println(e.toString());


            //将错误以红色字体打印在控制台 最常用的
//            并且继续执行下面的语句
//            包含信息最多
//            什么异常 异常的信息 异常的位置
//            e.printStackTrace();
            
            //扔给方法的调用处
            throw e;
        }

 3.4finally关键字

finally修饰的代码块总会被执行

try{
…………
}catch(){}……

finally{
    //总会被执行
}

四、自定义异常

我们可以自己定义异常以便更好的调试程序

如何书写:

①写继承关系②空参和带参构造

应用场景:

当我们在键盘录入姓名年龄时,以前我们会打印一个提示信息,这还不够明确,现在我们直接抛出异常,这个异常信息我们就可以自定义。

public void setAge(int age) {
        if(age > 40 || age < 18){
            throw new NameFormatException(age + "年龄格式错误,应18~40");
        }
        this.age = age;
    }

//定义异常
public class AgeOutOfBoundException extends RuntimeException{
//空参构造
    public AgeOutOfBoundException() {
    }
//带参构造
    public AgeOutOfBoundException(String message) {
        super(message);
    }
}

五、总结

try-catch的执行原理

什么是编译异常,什么是运行异常,请举例

有继承关系的catch语句,捕获父类异常一定放到最后

finally关键字的作用

throw与throws的区别

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

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

相关文章

pensieve运行的经验

1运行run_videopy时出现如下问题&#xff1a; cmd: Union[List[str], str], ^ SyntaxError: invalid syntax原因是EasyProcess版本与python版本不对应&#xff0c;解决办法可见之前这篇博客&#xff1a;SyntaxError: invalid syntax。 2解决完上述问题后&#xff0c;输…

NSSCTF第8页(1)

[HGAME 2023 week1]Classic Childhood Game js代码审计&#xff0c;找关键语句&#xff0c;发现event.js里边东西是最多的 找到了通关语句 他下边应该是就关键代码了&#xff0c;有一串16进制代码 解出来是base64&#xff0c;接着解 两次base64 解码&#xff0c;就得到了flag…

Vector3(即是位置,也是方向)

在三维世界中&#xff0c;最重要的就是确定物体在三维世界中 的位置、大小和缩放等信息。在Unity中&#xff0c;Vector3结构体就是用来表示这些信息的&#xff0c;此外也用Vector2来表示二维世界中的信息。 Vector3结构体由x、y、z这3个数值组成&#xff0c;表示了一个向量&am…

Nautilus Chain 与 Coin98 生态达成合作,加速 Zebec 生态亚洲战略进

目前&#xff0c;行业内首个模块化 Layer3 架构公链 Nautilus Chain 已经上线主网&#xff0c;揭示了模块化区块链领域迎来了全新的进程。在主网上线后&#xff0c;Nautilus Chain 将扮演 Zebec 生态中最重要的底层设施角色&#xff0c;并将为 Zebec APP 以及 Zebec Payroll 规…

算法-动态规划-java

文章目录 动态规划动态规划的核心动态规划算法的两种形式首先使用递归的方法实现这个算法①自顶向下的备忘录法②自底向上的动态规划&#xff08;推荐使用&#xff09; 更好的理解动态规划经典例题&#xff1a;钢条分割首先使用递归的方法实现这个算法①自顶向下的备忘录法②自…

2023-10-16 LeetCode每日一题(只出现一次的数字 III)

2023-10-16每日一题 一、题目编号 260. 只出现一次的数字 III二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答…

CSS中 通过自定义属性(变量)动态修改元素样式(以 el-input 为例)

传送门&#xff1a;CSS中 自定义属性&#xff08;变量&#xff09;详解 1. 需求及解决方案 需求&#xff1a;通常我们动态修改 div 元素的样式&#xff0c;使用 :style 和 :class 即可&#xff1b;但想要动态修改 如&#xff1a;Element-ui 中输入框&#xff08;input&#x…

【每日一题】统计无向图中无法互相到达点对数

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;并查集方法二&#xff1a;DFS乘法原理 写在最后 Tag 【DFS乘法原理】【并查集】【图】【数组】【2023-10-21】 题目来源 2316. 统计无向图中无法互相到达点对数 题目解读 节点之间的连接关系是通过数组给出的&#x…

10月9日 Jdbc(2)

PreparedStatement的使用和jdbcUtil工具类的封装 拼接带来的sql注入问题(拼接sql) Statement PreparedStatement的使用 package com.fs.db;import com.fs.util.JdbcUtil;import java.sql.*; import java.util.Date; import java.util.Scanner;/*** 模拟SQL攻击*/ public clas…

使用 dynamic-datasource 完成多数据源操作

本次操作是将达梦数据库的数据插入到MySQL数据库中。 准备工作 创建一个 Spring Boot 项目添加依赖配置数据源属性 POM文件 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</art…

Python机器学习入门指南

前言 机器学习 作为人工智能领域的核心组成&#xff0c;是计算机程序学习数据经验以优化自身算法&#xff0c;并产生相应的“智能化的”建议与决策的过程。 一个经典的机器学习的定义是&#xff1a; A computer program is said to learn from experience E with respect to …

【软考】11.6 系统转换/系统维护/系统评价

《系统转换》 遗留系统 &#xff08;改造&#xff09;高水平高价值&#xff08;集成&#xff09;高水平低价值&#xff08;继承&#xff09;低水平高价值&#xff08;淘汰&#xff09;低水平低价值 系统转换 《系统维护》 耗时长、成本高 提高可维护性是在软件设计和开发阶…

搞个微信小程序001

一&#xff0c;申请账号 开始 | 微信开放文档 二&#xff0c;安装开发者工具 开始 | 微信开放文档 我这里搞了个稳定版的。 三&#xff0c;第一个小程序 1&#xff0c;打开工具&#xff0c;扫码登录 2&#xff0c;新建以小程序 选择&#xff0c;不使用云服务&#xff0c…

SpringMVC的工作流程

1、SpringMVC的定义 Spring MVC是基于Java的开源Web框架&#xff0c;它是Spring框架的一部分&#xff0c;用于构建MVC&#xff08;Model-View-Controller&#xff09;模式的Web应用程序。它提供了一种灵活且强大的方式来开发Web应用程序&#xff0c;并将应用程序的不同层进行解…

C#接口和继承的区别、联系与使用场景

在C#编程语言中&#xff0c;接口和继承是两个核心的概念。本文将详细介绍接口和继承之间的区别与联系&#xff0c;并探讨它们在实际编程中的使用场景。通过代码示例和详细说明&#xff0c;读者将能够深入理解这两个概念的功能和用法。 目录 引言1. 区别与联系1.1 区别1.2 联系 …

curl命令服务器上执行http请求

1. 现在本地使用postman生成curl命令 注意: 将ip改成127.0.0.1,端口是实际服务运行的端口 curl --location --request POST http://127.0.0.1:63040/content/course/list?pageNo1&pageSize2 \ --header Content-Type: application/json \ --data-raw {"courseName&q…

FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6

一、FreeRTOS 介绍 什么是 FreeRTOS &#xff1f; Free即免费的&#xff0c;RTOS的全称是Real time operating system&#xff0c;中文就是实时操作系统。 注意&#xff1a;RTOS不是指某一个确定的系统&#xff0c;而是指一类操作系统。比如&#xff1a;uc/OS&#xff0c;Fr…

基于SSM的在线房屋租赁和电子签约系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

11 Self-Attention相比较 RNN和LSTM的优缺点

博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https://github.com/nickchen121/Pre-training-language-model 配套博客链接:https://www.cnblogs.com/nickchen121/p/15105048.html RNN 无法做长序列,当一…

自然语言处理---Transformer机制详解之Transformer优势

1 Transformer的并行计算 对于Transformer比传统序列模型RNN/LSTM具备优势的第一大原因就是强大的并行计算能力. 对于RNN来说&#xff0c;任意时刻t的输入是时刻t的输入x(t)和上一时刻的隐藏层输出h(t-1)&#xff0c;经过运算后得到当前时刻隐藏层的输出h(t)&#xff0c;这个…