异常机制二

目录

异常的处理方式之一:捕获异常

try-catch-finally 语句块的执行过程:

异常的处理方式之二:声明异常(throws 子句)

自定义异常


异常的处理方式之一:捕获异常

        捕获异常是通过 3 个关键词来实现的:try-catch-finally。用 try 来执行一段程序,如果 出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它,最后一步是 通过 finally 语句为异常处理ᨀ供一个统一的出口,finally 所指定的代码都要被执行(catch 语句可有多条;finally 语句最多只能有一条,根据自己的需要可有可无)。

 上面过程详细解析:

  • try:
            try 语句指定了一段代码,该段代码就是异常捕获并处理的范围。在执行过程中,当任 意一条语句产生异常时,就会跳过该条语句中后面的代码。代码中可能会产生并抛出一种或 几种类型的异常对象,它后面的 catch 语句要分别对这些异常做相应的处理。
    一个 try 语句必须带有至少一个 catch 语句块或一个 finally 语句块 。
    当异常处理的代码执行结束以后,不会回到 try 语句去执行尚未执行的代码。
  • catch:
    每个 try 语句块可以伴随一个或多个 catch 语句,用于处理可能产生的不同类 型的异常对象。
    常用方法,这些方法均继承自 Throwable 类 。
            toString ()方法,显示异常的类名和产生异常的原因
            getMessage()方法,只显示产生异常的原因,但不显示类名
            printStackTrace()方法,用来跟踪异常事件发生时堆栈的内容
    catch 捕获异常时的捕获顺序:
            如果异常类之间有继承关系,在顺序安排上需注意。越是顶层的类,越放 在下面,再不然就直接把多余的 catch 省略掉。 也就是先捕获子类异常 再捕获父类异常。
  • finally:
    有些语句,不管是否发生了异常,都必须要执行,那么就可以把这样的语句放 到 finally 语句块中。
    通常在 finally 中关闭程序块已打开的资源,比如:关闭文件流、释放数据库 连接等。

try-catch-finally 语句块的执行过程:

        程序首先执行可能发生异常的 try 语句块。如果 try 语句没有出现异常则执行完后跳至 finally 语句块执行;如果 try 语句出现异常,则中断执行并根据发生的异常类型跳至相应的 catch 语句块执行处理。catch 语句块可以有多个,分别捕获不同类型的异常。catch 语句块 执行完后程序会继续执行 finally 语句块。finally 语句是可选的,如果有的话,则不管是否发 生异常,finally 语句都会被执行。

即使 try 和 catch 块中存在 return 语句,finally 语句也会执行。是在执行完 finally 语句 后再通过 return 退出。

finally 语 句 块 只 有 一 种 情 况 是 不 会 执 行 的 , 那 就 是 在 执 行 finally 之 前 遇 到 了 System.exit(0)结束程序运行。

异常处理的典型代码(捕获异常)

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Test {
    public static void main(String[ ] args) {
        FileReader reader = null;
        try {
            reader = new FileReader("d:/a.txt");
            char c = (char) reader.read();
            char c2 = (char) reader.read();
            System.out.println("" + c + c2);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

异常的处理方式之二:声明异常(throws 子句)

        当 CheckedException 产生时,不一定立刻处理它,可以再把异常 throws 出去

        在方法中使用 try-catch-finally 是由这个方法来处理异常。但是在一些情况下,当前方法 并不需要处理发生的异常,而是向上传递给调用它的方法处理。

        如果一个方法中可能产生某种异常,但是并不能确定如何处理这种异常,则应根据异常 规范在方法的首部声明该方法可能抛出的异常。

        如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号 隔开。

异常处理的典型代码(声明异常抛出 throws)

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Test {
    public static void main(String[ ] args) {
        try {
            readFile("joke.txt");
        } catch (FileNotFoundException e) {
            System.out.println("所需文件不存在!");
        } catch (IOException e) {
            System.out.println("文件读写错误!");
        }
    }
    public static void readFile(String fileName) throws FileNotFoundException,
            IOException {
        FileReader in = new FileReader(fileName);
        int tem = 0;
        try {
            tem = in.read();
            while (tem != -1) {
                System.out.print((char) tem);
                tem = in.read();
            }
        } finally {
            in.close();
        }
    }
}

方法重写中声明异常原则:子类重写父类方法时,如果父类方法有声明异常,那么子类 声明的异常范围不能超过父类声明的范围。

自定义异常

  • 在程序中,可能会遇到 JDK ᨀ供的任何标准异常类都无法充分᧿述清楚我们想要 表达的问题,这种情况下可以创建自己的异常类,即自定义异常类。
  • 自定义异常类只需从 Exception 类或者它的子类派生一个子类即可。
  • 自定义异常类如果继承 Exception 类,则为受检查异常,必须对其进行处理;如果 不想处理,可以让自定义异常类继承运行时异常 RuntimeException 类。
  • 习惯上,自定义异常类应该包含 2 个构造器:一个是默认的构造器,另一个是带有 详细信息的构造器。

自定义异常类

/**IllegalAgeException:非法年龄异常,继承 Exception 类*/
class IllegalAgeException extends Exception {
    //默认构造器
    public IllegalAgeException() {
    }
    //带有详细信息的构造器,信息存储在 message 中
    public IllegalAgeException(String message) {
        super(message);
    }
}

自定义异常类的使用

class Person {
    private String name;
    private int age;
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) throws IllegalAgeException {
        if (age < 0) {
            throw new IllegalAgeException("人的年龄不应该为负数");
        }
        this.age = age;
    }
    public String toString() {
        return "name is " + name + " and age is " + age;
    }
}
public class TestMyException {
    public static void main(String[ ] args) {
        Person p = new Person();
        try {
            p.setName("Lincoln");
            p.setAge(-1);
        } catch (IllegalAgeException e) {
            e.printStackTrace();
            System.exit(-1);
        }
        System.out.println(p);
    }
}

使用异常机制的建议
        要避免使用异常处理代替错误处理,这样会降低程序的清晰性,并且效率低下

        处理异常不可以代替简单测试---只在异常情况下使用异常机制

        不要进行小粒度的异常处理---应该将整个任务包装在一个 try 语句块中

        异常往往在高层处理

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

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

相关文章

【UE5】动画蒙太奇简述

项目资源文末百度网盘自取 动画蒙太奇基本功能 动画蒙太奇&#xff08;Animation Montage&#xff09; 可以将多个 动画序列&#xff08;Animation Sequences&#xff09; 合并为单个资产并通过蓝图播放&#xff0c;还可以将一个蒙太奇动画切分为多个 蒙太奇分段&#xff08;M…

数据结构从入门到精通——二叉树的实现

二叉树的实现 前言一、二叉树链式结构的实现1.1前置说明1.2二叉树的手动创建 二、二叉树的遍历2.1 前序、中序以及后序遍历二叉树前序遍历二叉树中序遍历二叉树后序遍历2.2 层序遍历练习 三、二叉树的具体代码实现二叉树的节点个数二叉树叶子节点个数二叉树第k层节点个数二叉树…

【数字图像处理系列】读取图像

【数字图像处理系列】读取图像 使用函数 imread 可以将图像读人 MATLAB 环境&#xff0c;imread 的语法为 imread(filename)其中&#xff0c;filename是一个含有图像文件全名的字符串(包括任何可用的扩展名)。例如&#xff0c;命令行 >>f imread(pout.tif)将tif图像po…

MATLAB环境下基于振动信号的轴承状态监测和故障诊断

故障预测与健康管理PHM分为故障预测和健康管理与维修两部分&#xff0c;PHM首先借助传感器采集关键零部件的运行状态数据&#xff0c;如振动信号、温度图像、电流电压信号、声音信号及油液分析等&#xff0c;提取设备的运行监测指标&#xff0c;进而实现对设备关键零部件运行状…

精确率(召回率)的权衡(Machine Learning研习十六)

精确率&#xff08;召回率&#xff09;的权衡 为了理解这种权衡&#xff0c;让我们看看 SGDClassifier如何做出分类决策。 对于每个实例&#xff0c;它根据决策函数计算分数。 如果该分数大于阈值&#xff0c;则将该实例分配给正类&#xff1b; 否则它会将其分配给负类。 图 3…

基于SpringBoot+Vue保密信息学科平台系统设计与实现(源码+部署说明+演示视频+源码介绍+lw)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

filezilla客户端的应用以及ftplftpwget的用法

filezilla的应用 用户的配置查看上一篇文章FTP3种用户的配置 进入filezilla软件测试 用yy用户登录发现可以上传下载创建删除 再用cc用户登录发现不能上传不能删除不能创建只能下载 ftp&lftp&wget客户端的应用 以命令行的方式连接ftp&#xff0c;一般只会用到上…

【HTTP完全注解】范围请求

范围请求 范围请求是HTTP的一种内容协商机制&#xff0c;该机制允许客户端只请求资源的部分内容。范围请求在传送大的媒体文件&#xff0c;或者与文件下载的断点续传功能搭配使用时非常有用。 范围请求的工作流程 范围请求通过在HTTP请求标头Range中表明需要请求的部分资源的…

Windows东方通下载及使用

把安装包都拖到桌面来&#xff0c;可以拖一个解压包进去 下载东方通可以不用配环境变量 双击安装包 下一步 点击接受 选择版本&#xff0c;都可以 选择安装路径 下一步 点击安装 改端口号 移到桌面 把安装包里面的文件拖进去 过期了&#xff0c;记得改时间 点击时间面板&…

【回顾练习】静态路由配置综合实验报告

一、分析要求 为R6设备配置公有IP地址&#xff0c;并确保只能进行IP地址配置&#xff0c;无法进行其他配置。为R1-R5设备分配私有IP地址。为R1、R2、R4配置两个环回地址&#xff0c;为R5、R6配置一个环回地址。在R3上配置DHCP服务&#xff0c;以供两台PC自动获取IP地址。使用动…

Vuex状态、数据持久化(vue2、vue3状态数据持久化)

简介&#xff1a;Vuex是一个仓库&#xff0c;是vue的状态管理工具&#xff0c;存放公共数据&#xff0c;任何组件都可以使用vuex里的公共数据。Vuex提供了插件系统&#xff0c;允许我们使用 vuex-persistedstate插件&#xff0c;将Vuex的状态持久化到本地存储中&#xff0c;解决…

如何安装配置Goland并使用固定公网地址SSH远程连接本地服务器

文章目录 1. 安装配置GoLand2. 服务器开启SSH服务3. GoLand本地服务器远程连接测试4. 安装cpolar内网穿透远程访问服务器端4.1 服务器端安装cpolar4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 本文主要介绍使用GoLand通过SSH远程连接服务器&#xff0c;并结合cpolar内…

蓝桥杯--高精度加法--基础

import java.util.*; import java.math.*; public class BASIC30 {public static void main(String[] args) {//阶乘的运算&#xff0c;因为计算出来的数据会足够的大&#xff0c;所以这个地方使用阶乘Scanner scanner new Scanner(System.in);//只能将对应的字符串转化为BigI…

STL —— string(1)

目录 1. 模板 1.1 泛型编程 1.2 函数模板 1.2.1 函数模板概念 1.2.2 函数模板格式 1.2.3 函数模板的原理 1.2.4 显式实例化 1.2.5 模板参数的匹配原则 1.3 类模板 1.3.1 类模板定义格式 1.3.2 类模板的实例化 2. STL —— string类 2.1 STL 简介 2.2 标准库中的s…

Gold Effects

HDRP、URP、LWRP和标准支持 完全可定制的金币效果。几乎每个属性都是可调整的,您可以更改这些效果的颜色、渐变、噪波纹理和整体形状。支持HDRP、URP和LWRP,当然也支持标准渲染器。易于拖放设置,带有定制示例的演示场景。使用标准Unity Animator为箱子制作动画,因此您可以轻…

#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行

3 月 19 日&#xff0c;#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行。 现场&#xff0c;深圳市南山区人民政府副区长李志娜发布《2024 年南山区支持鸿蒙原生应用发展首批政策措施清单》&#xff0c;从加强鸿蒙原生应用供给能力、推动鸿蒙原生应用产业集聚、完善鸿蒙原生…

windows管理github代码

资料 windows SSH下载github

Windows抓取密码的四种方式其他各类密码抓取

对于Windows&#xff08;不是域环境&#xff09;我们有四种方法去抓取它的密码 在线读取SAM文件离线读取SAM文件在线读取Lsass进程离线读取Lsass进程 在这次的blog&#xff0c;我们还是用的mimkatz 目录 1.在线读取SAM文件 2.离线读取sam文件 3.在线读取lsass进程 4.离线…

如何与手机共享笔记本电脑的互联网?这里提供详细步骤

这篇文章介绍了如何通过将手机变成Wi-Fi热点来与手机共享笔记本电脑的互联网连接。 如何共享笔记本电脑的互联网连接 你可以通过Wi-Fi或有线共享笔记本电脑的数据连接,具体取决于你的设置。 Windows Windows允许你通过ICS共享你的互联网连接。ICS,或称互联网连接共享,是W…

如何使用 PDF 转换器完成 PDF 转 Word

如果您正在寻找能够轻松将 PDF 转换为 Word 的软件&#xff0c;那么奇客PDF转换器是一个不错的选择。下面这篇文章将指导您如何使用奇客PDF转换器将PDF文件转换为Word。 奇客PDF转换器也称为奇客PDF&#xff0c;是将 PDF 文件内容转换为 Word 文本格式的优秀工具。通过使用 PD…