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

一、概述

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';
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信息安全与密码技术概述

1. 信息安全的法律法规 2016年11月7日&#xff0c;中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议通过《中华人民共和国网络安全法》&#xff0c;自2017年6月1日起施行。 2019年10月26日&#xff0c;中华人民共和国第十三届全国人民代表大会常务委员会第十四…

C++ | Leetcode C++题解之第139题单词拆分

题目&#xff1a; 题解&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {auto wordDictSet unordered_set <string> ();for (auto word: wordDict) {wordDictSet.insert(word);}auto dp vector <bool> (s.…

高质量 HarmonyOS 权限管控流程

高质量 HarmonyOS 权限管控流程 在 HarmonyOS 应用开发过程中&#xff0c;往往会涉及到敏感数据和硬件资源的调动和访问&#xff0c;而这部分的调用就会涉及到管控这部分的知识和内容了。我们需要对它有所了解&#xff0c;才可以在应用开发中提高效率和避免踩坑。 权限管控了…

Django 表里做删除

先看效果图 点击 删除 按钮之后&#xff0c;就可以下面的效果 操作步骤&#xff1a; 1. 在 urls.py 文件里&#xff0c;添加路劲&#xff1a; urlpatterns [path(asset/<int:aid>/delete/, am_views.asset_delete),]2. 在 views.py 文件里&#xff0c;实现一个新的函…

RHEL8/Centos8 install for PXE

PXE介绍 PXE&#xff08;Preboot Execution Environment&#xff09;是预引导执行环境的缩写。它是由Intel设计的&#xff0c;允许客户端计算机通过网络从服务器上加载操作系统镜像。PXE通常用于大规模部署操作系统&#xff0c;例如在企业或学校环境中。 PXE工作流程如下&…

上位机快速开发框架

右上角向下按钮 -> 后台配置 系统菜单 角色管理 分配权限 用户管理 设备配置 通道管理 首页界面设计 设备1配置 带反馈按钮&#xff0c;如&#xff1a;用户按键00105&#xff0c;PLC反馈状态00106 设备2配置 参数说明&#xff1a; TagName_Main&#xff1a;主要信息&#…

mac读不出来ntfs mac硬盘读不出来盘

新买的Mac电脑由于需要导入旧电脑的数据&#xff0c;因此通常会读取备份硬盘&#xff0c;通过硬盘进行导入。不过由于各种原因&#xff0c;有些mac用户反馈无法正常读取或写入NTFS移动硬盘&#xff0c;下面就通过本篇教程&#xff0c;简单讲述当mac读不出来ntfs&#xff0c;mac…

二分+模拟,CF1461D - Divide and Summarize

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1461D - Codeforces 二、解题报告 1、思路分析 我们发现每次分裂操作结果都是固定的 我们从初始序列分裂出两个确定的子序列&#xff0c;两个确定的子序列又分裂出4个确定的子序列 那么也就是说…

前端:快捷 复制chrome 控制台打印出来的 数组对象

程序中console.log出来的对象。按照以下步骤操作 1.右键点击需要处理的对象&#xff0c;会出现Store as global variable&#xff0c;点击 2.点击 Store as global variable 控制台会出现 3.在控制台 输入 copy(temp1) 这样对象就复制到了你的黏贴面板里面 在代码中直接 c…

C# WPF入门学习主线篇(十)—— DataGrid常见属性和事件

C# WPF入门学习主线篇&#xff08;十&#xff09;—— DataGrid常见属性和事件 欢迎来到C# WPF入门学习系列的第十篇。在前面的文章中&#xff0c;我们已经学习了 Button、TextBox、Label、ListBox 和 ComboBox 控件。今天&#xff0c;我们将探讨 WPF 中的另一个重要控件——D…

计算机网络 —— 网络层(子网掩码和子网划分)

计算机网络 —— 网络层&#xff08;子网掩码和子网划分&#xff09; 网络地址转换NAT子网掩码和子网划分举个例子第一步&#xff1a;看类型第二步&#xff1a;从主机号开始比对第三步&#xff1a;去头去尾 我们今天来看子网掩码和子网划分&#xff1a; 网络地址转换NAT 网络…

碳素钢化学成分分析 螺纹钢材质鉴定 钢材维氏硬度检测

碳素钢的品种主要有圆钢、扁钢、方钢等。经冷、热加工后钢材的表面不得有裂缝、结疤、夹杂、折叠和发纹等缺陷。尺寸和允许公差必须符合相应品种国家标准的要求。 具体分类、按化学成分分类 &#xff1a; 碳素钢按化学成分&#xff08;即以含碳量&#xff09;可分为低碳钢、中…

Objective-C 学习笔记 | 基础

Objective-C 学习笔记 | 基础 参考书&#xff1a;《Objective-C 编程&#xff08;第2版&#xff09;》 第1部分 入门 Objective-C语言是以C语言为基础的&#xff0c;但增加了对面向对象编程的支持。Objective-C语言是用来开发在苹果iOS以及OS X操作系统上运行的应用的编程语…

Coze入门指南:创建Bot时,如何写好人设与回复逻辑(Persona Prompt)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Coze Bot 📒📝 Persona & Prompt🌟 # Character🌟 ## Skills🌟 # Overall Rules to follow🌟 ## Workflow🌟 ## Constraints📝 通用写法与模板📝 示例🌟技巧和注意事项⚓️ 相关链接 ⚓️📖 介绍 📖…

VSCode数据库插件

Visual Studio Code (VS Code) 是一个非常流行的源代码编辑器&#xff0c;它通过丰富的插件生态系统提供了大量的功能扩展。对于数据库操作&#xff0c;VS Code 提供了几种插件&#xff0c;其中“Database Client”系列插件是比较受欢迎的选择之一&#xff0c;它包括了对多种数…

【机器学习】机器学习与医疗健康在智能诊疗中的融合应用与性能优化新探索

文章目录 引言机器学习与医疗健康的基本概念机器学习概述监督学习无监督学习强化学习 医疗健康概述疾病预测诊断辅助个性化治疗方案制定 机器学习与医疗健康的融合应用实时健康监测数据预处理特征工程 疾病预测与优化模型训练模型评估 诊断辅助与优化深度学习应用 个性化治疗方…

Vue第三方库与插件实战手册

title: Vue第三方库与插件实战手册 date: 2024/6/8 updated: 2024/6/8 excerpt: 这篇文章介绍了如何在Vue框架中实现数据的高效验证与处理&#xff0c;以及如何集成ECharts、D3.js、Chart.js等图表库优化数据可视化效果。同时&#xff0c;探讨了Progressive Web App(PWA)的接入…

性能提升70%~220%,OBKV提高事务处理效率

1. OBKV 是什么&#xff1f; OBKV&#xff0c;OceanBase的多模KV产品&#xff0c;专注低成本、大规模的结构化或半结构化数据存储&#xff0c;并提供高效访问性能的简易操作接口。 在实现层面&#xff0c;OBKV Bypass了SQL层&#xff0c;直接基于OceanBase的分布式存储构建了…

Linux内核下网卡硬件 MAC 和PHY分析笔记

1 简介 通常CPU自带的以太网接口是MAC控制器&#xff0c;为了实现完整的功能&#xff0c;外围硬件还需要增加一个PHY芯片。 PHY芯片在建立网络连接时负责协商确定网速、全双工 或者 半双工等。在正常通讯时负责在MAC控制器的MII信号 与 网线中的信号之间做转换。 本文的内核代…