java中的异常-异常处理(try、catch、finally、throw、throws)+自定义异常

news2024/11/29 2:50:40

一、概述

1、java程序员在编写程序时提前编写好对异常的处理程序,在程序发生异常时就可以执行预先设定好的处理程序,处理程序执行完之后,可以继续向后执行后面的程序

2、异常处理程序是在程序执行出现异常时才执行的

二、5个关键字

1、try代码块,执行可能出现异常的代码

2、catch代码块,捕获类型匹配的异常对象并执行异常处理代码

3、finally代码块,里面包含的是必须要执行的代码

4、throws,定义一个方法时可以使用throws关键字声明,表示此方法不处理异常,而是就交给方法调用处进行处理

三、使用try和catch

try(异常类型 引用名){

 异常处理代码

}

1、典例一

public static void main(String[] args) {

        try {
            // 可能会出现异常的代码
            int a=1;
            int b=0;
            int c=a/b;
        }catch (ArithmeticException e){// 异常类型 异常类型的引用变量名
            System.out.println("除数不能为0");// 异常处理代码
        }
        System.out.println("后面的程序");
    }

2、典例二:try代码块中出现异常的那一行程序后面的程序不会再被执行

public static void main(String[] args) {

        try {
            // 可能会出现异常的代码
            int a=1;
            int b=0;
            int c=a/b;
            String s="我爱吃西瓜";
            System.out.println(s);
        }catch (ArithmeticException e){// 异常类型 异常类型的引用变量名
            System.out.println("除数不能为0");// 异常处理代码
        }
        System.out.println("后面的程序");
    }

3、典例三: try代码块中如果可能出现多个异常则使用多个catch代码块去处理处理异常

public static void main(String[] args) {

        try {
            // 可能会出现异常的代码
            int a=1;
            int b=1;
            int c=a/b;
            String s=null;
            System.out.println(s.length());
            System.out.println("我爱吃西瓜");
        }catch (ArithmeticException e){// 异常类型 异常类型的引用变量名
            System.out.println("除数不能为0");// 异常处理代码
        }catch (NullPointerException e){
            System.out.println("字符串引用变量的值不能为null");
        }
        System.out.println("后面的程序");
    }

4、典例四: try代码块中如果不清楚会出现什么异常可以使用Exception作为异常类型去捕捉异常对象

 public static void main(String[] args) {

        try {
            // 可能会出现异常的代码
            int a=1;
            int b=1;
            int c=a/b;
            String s=null;
            System.out.println(s.length());
            System.out.println("我爱吃西瓜");
        }catch (ArithmeticException e){// 异常类型 异常类型的引用变量名
            System.out.println("除数不能为0");// 异常处理代码
        }catch (Exception e){
            e.printStackTrace();// 输出异常类型和异常位置
            System.out.println("程序异常:"+e.getMessage());// 打印异常原因
        }
        System.out.println("后面的程序");
    }

注意:捕捉父类异常的cath代码块必须放在捕捉子类异常的catch代码块之前

四、使用finally

finally代码块中都是一些必须要执行的代码

finally{

     必须要执行的代码

}

1、典例一:应用场景(catch代码块中可能会出现异常)

try {
            // 可能会出现异常的代码
            int a=1;
            int b=0;
            int c=a/b;
            System.out.println("我爱吃西瓜");
        }catch (ArithmeticException e){// 异常类型 异常类型的引用变量名
            String s=null;
            System.out.println(s.length());
            System.out.println("除数不能为0");// 异常处理代码
        }finally {
            System.out.println("最终必须要执行的代码");
        }
        System.out.println("后面的代码");

2、典例二:应用场景(必须要执行且只能放在finally代码块中的代码)

public int sum() throws IOException {
        FileInputStream inputStream=null;
        try {
            inputStream=new FileInputStream("E:/a.txt");

        }catch (FileNotFoundException f){
           f.printStackTrace();
            System.out.println("没找到文件");

        }finally {
            if (inputStream!=null){
                inputStream.close();
                System.out.println("关闭流通道");
            }
            return 100;
        }
    }

3、典例三:实际应用场景(IO读取文件时必须关闭流通道)

public static void main(String[] args) throws IOException {
        FileInputStream inputStream=null;
        try {
            inputStream=new FileInputStream("E:/hhh.txt");// 创建流通道
            inputStream.read();
        }catch (FileNotFoundException f){
            f.printStackTrace();
            System.out.println("找不到文件");
        }catch (IOException i){
            i.printStackTrace();
            System.out.println("读文件出现异常");
        }finally {
            if(inputStream!=null){
               inputStream.close();// inputStream不为null,关闭流通道
            }
        }

    }

五、使用throws

public void test throws 异常1,异常2,异常3{

代码

}

1、任何方法都可以使用throws声明异常类型,包括抽象方法

2、一个方法可以声明多个异常类型

3、调用使用了throws的方法时必须处理声明的异常,要么使用try-catch,要么继续使用throws声明

4、如果抛出的是运行期异常,不会有提示,需要查看所调用的方法结构

5、典例

public class Demo {
    public static void main(String[] args) {
        try {
            int res=divide(1,0);
            System.out.println(res);
        }catch (ArithmeticException a){
            a.printStackTrace();
            System.out.println("除数不能为0");
        }
        try {
            byte[]bytes=transform("abc");
            System.out.println(Arrays.toString(bytes));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    }
    // 除法运算
    public static int divide(int a,int b)throws ArithmeticException{// ArithmeticException 运行期异常 无提示 继承了RuntimeException
        return a/b;
    }
    // 字符串转为字节数组返回
    public  static byte[] transform(String s) throws UnsupportedEncodingException {// UnsupportedEncodingException 编译期异常 有提示 不继承RuntimeException
        byte[] bytes=s.getBytes("utf-8");// 指定编码格式
        return bytes;
    }
}

六、异常可以分为运行期异常和编译期异常两种

1、编译时期异常(即checked异常、受检异常):

(1)代码编译阶段,编译器就能明确当前代码可能发生XX异常

(2)并明确督促程序员提前编写处理它的的代码

(3)如果程序员没有编写对应的处理代码,编译期就会判定编译失败,从而不能生成字节码文件

(4)通常,这类异常的发生不是由程序员编写的代码引起的,例如:FileNotFoundException(文件找不到异常)

2、运行时期异常(即runtime异常、unchecked异常、非受检异常):

(1)代码编译阶段,编译器不做任何检查,无论该异常是否会发生,编译器都不会给出任何提示

(2)只有等代码运行起来并发生了XX异常,异常才能被发现

(3)通常,这类异常是由程序员的代码编写不当引起的,只要程序员编写代码稍加判断并且细心检查就可以避免

(4)java.lang.RuntimeException类及子类都是运行时异常,比如:ArrayIndexOutOfBoundsException数组下标越界异常,ClassCastException类型转换异常

七、使用throw

1、作用

在程序不满足某种条件时显示地抛出一个异常类的实例化对象,程序就不能继续向下执行

2、语法

throw new 异常类构造方法

如:throw new RunTimeException()

3、典例

public class Demo1 {
    public static void main(String[] args) {
        try {
            char res=checkScore(690);
            System.out.println(res);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("程序异常:"+e.getMessage());
        }
    }

    /*
    给分数划登记
    100~90 A
    89~80 B
    79~0 C
     */
    public static char checkScore(int score) throws Exception {
        if (score < 0 || score > 100) {
            throw new Exception("分数不合法");
        }
        if (score >= 90) {
            return 'A';
        } else if (score >= 80) {
            return 'B';
        } else {
            return 'C';
        }
    }
}

八、自定义异常

1、来源

(1)javaAPI中定义的标准异常类都是与语法相关的,比如索引越界异常、空指针异常

(2)但我们的程序有时候想要在不满足某种业务条件时以抛出异常的形式来做处理,此时就需要我们自定义一个与业务相关的异常类来表示,例如分数不合法异常(ScoreException)

public class ScoreException extends Exception{
    public ScoreException() {
    }

    public ScoreException(String message) {
        super(message);
    }
}
public class Demo1 {
    public static void main(String[] args) {
        try {
            char res=checkScore(690);
            System.out.println(res);
        } catch (ScoreException e) {
            e.printStackTrace();
            System.out.println("程序异常:"+e.getMessage());
        }
    }

    /*
    给分数划登记
    100~90 A
    89~80 B
    79~0 C
     */
    public static char checkScore(int score) throws ScoreException {
        if (score < 0 || score > 100) {
            throw new ScoreException("分数不合法");
        }
        if (score >= 90) {
            return 'A';
        } else if (score >= 80) {
            return 'B';
        } else {
            return 'C';
        }
    }
}

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

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

相关文章

11 gpio 与 pinctrl 子系统

1、GPIO 硬件结构 GPIO 是通用输入/输出端口的简称。GPIO 的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 八种工作模式 GPIO_Mode_AIN 模拟输入 GPIO_Mode_IN_FLOATING 浮空输入 GPIO_Mode_IPD 下拉输入 GPIO_Mode_IPU 上拉输入GP…

Hadoop笔记

1.hadoop环境搭建&#xff0c;linux命令&#xff08;vi);2.分布式的基本概念&#xff0c;cap理论&#xff08;遵循此原则开发分布式数据库&#xff09;&#xff0c;hdfs,mapreduce&#xff1b;3.3.1&#xff1b;3.2重点&#xff1b;4.map&#xff0c;reduce过程&#xff0c;优缺…

DBeaver无法连接Clickhouse,连接失败

DBeaver默认下载的是0.2.6版本的驱动&#xff0c;但是一直连接失败&#xff1a; 报错提示 解决办法 点击上图中的Open Driver Configuration点击库 - 重置为默认状态在弹出的窗口中修改驱动版本号为0.2.4或者其他版本&#xff08;我没有试用过其他版本&#xff09;&#xff0…

c++【入门】求圆环的面积

限制 时间限制 : 1 秒 内存限制 : 128 MB 题目 如下图所示的圆环铁片&#xff0c;中间是空心的&#xff0c;已知圆环外圆的半径是r1厘米&#xff08;如&#xff1a;10cm&#xff09;&#xff0c;内圆半径是r2厘米&#xff08;如&#xff1a;6cm&#xff09;&#xff0c;请编…

stm32最小系统焊接调试总结

stm32最小系统打板后,接下来开始焊接元器件,焊接元器件可以参考立创EDA焊接辅助工具。 图1 焊接辅助助手 焊接准备工具有,焊台,放大镜,元器件,镊子,焊锡膏,锡丝及万用表等。调节焊台温度到350-400摄氏度。焊接顺序是先焊接USB typec接口,5V电源,ldo,ch340,stm32芯片…

标准发布实施 | 《村镇污水处理一体化集成装备技术规范》

根据《中华人民共和国标准化法》以及国家标准化管理委员会、民政部联合制定的《团体标准管理规定》&#xff0c;依据全国团体标准信息平台和《中华环保联合会团体标准管理办法&#xff08;试行&#xff09;》&#xff0c;全国团体标准《村镇污水处理一体化集成装备技术指南》&a…

32.768k晶振FC-135R在智能手表手环中的作用

随着智能设备的普及&#xff0c;智能手表和手环已经成为人们日常生活中不可或缺的科技产品。晶振在智能手表手环中的作用是通过传感器给智能手环连接提供信号频率&#xff0c;是很重要的核心部位&#xff0c;这些设备的核心在于其精准的时钟管理和低功耗特性&#xff0c;32.768…

Polar Web【中等】xxe

Polar Web【中等】xxe Contents Polar Web【中等】xxe思路&探索EXP运行&总结 思路&探索 如题目所示&#xff0c;此题考查XXE漏洞&#xff0c;具体细节需要逐步深挖 打开站点&#xff0c;提示了flag所在的文件&#xff0c;点击按钮&#xff0c;可见php的配置信息&am…

【CS.DB】深度解析:ClickHouse与Elasticsearch在大数据分析中的应用与优化

文章目录 《深入对比&#xff1a;在大数据分析中的 ClickHouse和Elasticsearch》 1 介绍 2 深入非关系型数据库的世界2.1 非关系型数据库的种类2.2 列存储数据库&#xff08;如ClickHouse&#xff09;2.3 搜索引擎&#xff08;如Elasticsearch&#xff09;2.4 核心优势的归纳 3…

[word] word文字间隙怎么调整? #媒体#职场发展

word文字间隙怎么调整&#xff1f; 在文档中的数据包含英文、数字、中文等&#xff0c;会有间隙&#xff0c;有时候误以为是空格&#xff0c;但是根本删除不了&#xff0c;其实这是默认的间隙&#xff0c;是可以调整的&#xff0c;下面教大家word文字间隙怎么调整的操作&#…

【Modelground】个人AI产品MVP迭代平台(4)——Mediapipe视频处理网站介绍

文章目录 介绍模型配置输入输出核心实现&#xff08;源码&#xff09;总结 介绍 这篇文章我将硬核介绍Modelground的第一个产品——Mediapipe视频处理&#xff01;网站入口为https://tryiscool.space/ml-video/&#xff0c;如图所示&#xff0c;欢迎体验。 tip: 由于服务器带宽…

以客户为中心:消费电子行业的产品研发之道

在消费电子行业这片快速变化的领域中&#xff0c;产品的迭代更新和技术的创新是推动行业不断前进的动力。然而&#xff0c;随着市场的日益成熟和消费者需求的多样化&#xff0c;如何确保产品能够满足目标用户的需求&#xff0c;成为摆在每一个产品研发团队面前的难题。本文将探…

理解JVM内存模型与Java内存模型(JMM)

理解JVM内存模型与Java内存模型&#xff08;JMM&#xff09; 在Java程序的运行过程中&#xff0c;内存管理和线程的同步是两个重要的概念。本文将深入探讨JVM内存模型&#xff08;Java Virtual Machine Memory Model&#xff09;和JMM&#xff08;Java Memory Model&#xff0…

PyTorch学习5:Logistic回归

文章目录 前言一、分类问题简介二、示例1.示例步骤2.示例代码 总结 前言 介绍利用PyTorch实现Logistic回归的分类问题 一、分类问题简介 分类问题的输出为属于每一个类别的概率&#xff0c;概率值最大的即为所属类别。最常见的Sigmoid函数&#xff1a;Logistic函数。 二、示…

了解Java内存模型(Java Memory Model, JMM)

了解Java内存模型&#xff08;Java Memory Model, JMM&#xff09; Java内存模型&#xff08;Java Memory Model, JMM&#xff09;是Java语言规范中规定的一组规则&#xff0c;定义了多线程程序中变量&#xff08;包括实例字段、静态字段和数组元素&#xff09;的访问方式。JM…

树莓派4b安装宝塔面板

1、打开命令窗口&#xff0c;执行如下命令 #更新 sudo apt-get update sudo apt-get upgrade #切换root权限 sudo su root #安装宝塔面板 wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && bash install.sh安装过程有点久&#xff0c;会持…

备份树莓派系统的多种方法,构建镜像

在我们使用树莓派进行学习或者搭建实验环境时经常会把系统玩坏&#xff0c;辛苦配置的开发环境又得重新配置&#xff1b;或者更新某一软件后发现新版本和某些组件不兼容&#xff0c;又无法降级。这个时候我们会想将系统在稳定时进行备份&#xff0c;在系统出现问题后可以很方便…

在AMD GPU上加速大型语言模型的Flash Attention

Accelerating Large Language Models with Flash Attention on AMD GPUs — ROCm Blogs 引言 在这篇博客文章中&#xff0c;我们将指导您如何在AMD GPU上安装Flash Attention&#xff0c;并提供与在PyTorch中标准SDPA比较其性能的基准测试。我们还将测量Hugging Face中多个大型…

locale本地化库学习

std::locale 类型的对象&#xff08;本地环境对象&#xff09;是不可变刻面的一个不可变索引集。C 输入/输出库的每个流对象都与一个 std::locale 对象关联&#xff0c;并用它的各刻面来分析及格式化所有数据。另外&#xff0c;每个 std::basic_regex 对象也都与一个本地环境对…

【Gitlab】Gitlab MAC M1通过Docker Desktop安装教程

一、拉取镜像 docker pull yrzr/gitlab-ce-arm64v8 二、配置容器 2.1 配置Volumes 镜像下载完成后&#xff0c;可在Docker Desktop看到镜像 点击run&#xff0c;弹出以下界面&#xff0c;配置端口映射和目录挂载后&#xff0c;即可生成一个容器 配置Volumes Host PathCont…