第7章异常、断言和曰志
Java和C++异
- 在C++中,throw说明符在运行时执行。Java在编译时执行。
处理错误
-
异常处理的任务就是将控制权从产生错误的地方转移到能够处理这种情况的错误处理器。
-
如果由于出现错误而使得某些操作没有完成,程序应该:返回到一种安全状态,并能够让用户执行其他的命令;或者允许用户保存所有工作的结果,并以妥善的方式终止程序。
-
程序中可能会出现的错误和问题
- 用户输入错误
- 设备错误。如打印机在打印过程中可能没有纸了。
- 物理限制。磁盘已满。
- 代码错误。数组越界。
- 某个抛出 (throw) 一个封装了错误信息的对象。需要注意的是,这个方法将会立刻退出,并不返回正常值(或任何值)。此外,也不会从调用这个方法的代码继续执行,取而代之的是,异常处理机制开始搜索能够处理这种异常状况的异常处理器(exception handler)。
异常分类
- 所有的异常都是由Throwable继承而来。
- 在下一层立即分解为两个分支:Error 和 Exception。Error类层次结构描述了 Java运行时系统的内部错误和资源耗尽错误。你的应用程序不应该抛出这种类型的对象。如果出现了这样的内部错误,除了通知用户,并尽力妥善地终止程序之外,你几乎无能为力。这种情况很少出现。
- Exception层次结构又分解为两个分支:一个分支派生于RuntimeException ;另一个分支包含其他异常。一般规则是:由编程错误导致的异常属于RuntimeException ;如果程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常。
派生于RuntimeException的异常包括以下问题:
- 错误的强制类型转换。
- 数组访问越界。
- 访问null指针。
不是派生于RuntimeException的异常包括:- 试图超越文件末尾继续读取数据。
- 试图打开一个不存在的文件
- 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在
- Java语言规范将派生于Error类或RuntimeException类的所有异常称为非检查型(unchecked)异常,所有其他的异常称为检查型(checked)异常。编译器将检查你是否为所有的检查型异常提供了异常处理器。

声明异常
一个方法必须声明所有可能抛出的检查型异常,不应该声明非检查型异常。如果你的方法没有声明所有可能发生的检查型异常,编译器就会发出一个错误消息。

如果在子类中覆盖了超类的一个方法,子类方法中声明的检查型异常不能比超类方法中声明的异常更通用(子类方法可以抛出更特定的异常,或者根本不抛出任何异常)。
例如,如果覆盖JComponent.paintComponent方法,由于超类中这个方法没有抛出任何检查型异常,所以,你的paintComponent也不能抛出任何检查型异常。
一个个方法抛出的异常可能属于这个异常类,也可能属于这个异常类的任意一个子类。
例如, FileinputStream构造器声明有可能抛出一个IOExcetion异常,在这种情况下,你并不知道具体是哪种IOExcetion异常。它既可能是IOException异常,也可能是其某个子类的对象,例如, FileNotFoundException。
捕获异常
捕获(try-catch)那些你知道如何处理的异常,而继续传播(throwable)那些你不知道怎样处理的异常。
再次抛出异常与异常链
为了改变异常的类型,可以在catch子句中抛出一个异常。


finally 子句
不管是否有异常被捕获,finally子句中的代码都会执行。
finally子句的体要用于清理资源。不要把改变控制流的语句(return,throw, break,continue)放在 finally 子句中。
场景
清理必须清理的资源
try-with-Resouroes 语句


分析堆栈轨迹元素
堆栈轨迹( stack trace)是程序执行过程中某个特定点上所有挂起的方法调用的一个列表。
访问堆栈轨迹的文本描述信息
- Throwable类的printStackTrace
var t = new Throwable();
var out = new StringWriterf);
t.printStackTrace(new PrintWriter(out));
String description = out.toStringl);
- StackWalker类

使用异常的技巧
- 异常处理不能代替简单的测试。
- 不要过分地细化异常。
- 充分利用异常层次结构。
- 不要压制异常。
- 在检测错误时,“苛刻”要比放任更好。
- 不要羞于传递异常。
注释:规则5、6可以归纳为“早抛出,晚捕获”。
使用断言
断言的概念
断言机制允许在测试期间向代码中插人一些检查,而在生产代码中会自动删除这些检查。

启用和禁用断言
- 不必重新编译程序来启用或禁用断言。启用或禁用断言是类加载器的功能。
- 可以使用开关有选择地启用或禁用某个特定类和包中的断言。
使用断言完成参数检查
Java中3种处理系统错误的机制:
- 抛异常
- 日志
- 断言
什么时候应该选择使用断言呢?
- 断言失败是致命的、不可恢复的错误。
- 断言检查只是在开发和测试阶段打开。
日志
日志API优点

基本日志-全局日志
Logger.getGlobal().setLevel(Level.OFF);Logger.getGlobal().info("global");String s = "jdiofjeijgfo;akjfoiej";System.out.println("logging" + s);

高级日志
定义自己的日志记录器
private static final Logger myLogger = Logger.getLogger("com.ypp.corejava"); //工厂方法创建
日志记录器的层次结构
- SEVERE
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
- 默认情况下,只记录前3个级别。
- 应该使用CONFIG、FINE、FINER和FINEST级别来记录那些有助于诊断但对用户意义不大的调试信息。
如果将记录级别设置为比INFO更低的级别,还需要修改日志处理器的配置才能正确打出日志。
跟踪执行流
- logp方法获得调用类和方法的确切位置.
默认的日志记录将显示根据调用堆栈得出的包含日志调用的类名和方法名。不过,如果
虚拟机对执行过程进行了优化,就得不到准确的调用信息。
- entering(), exiting() 生成FINER级别而且以字符串ENTRY和RETURN开头的日志记录。
public int read(String file, String pattern){int count=1;logger.entering("com.mycompany.mylib.Reader","read",new Object[]{file,pattern});logger.exiting("com.mycompany.mylib.Reader","read",count);return count;}
记录异常
throwing(), log方法。

修改日志管理器配置
本地化
本地化的应用程序包含资源包(中的本地特定信息。资源包包括一组映射,分别对应各个本地化环境。这些文件都是纯文本文件,包含如下所示的条目:
readingFile=Achtung! Datei wird eingelesen
renamingFile=Datei wird umbenannt
处理器
- 在默认情况下,日志记录器将记录发送到ConsoleHandler ,并由它输出到System.err流。
- 与日志记录器一样,处理器也有日志级别。对于一个要记录的日志记录,它的日志级别
必须高于日志记录器和处理器二者的阈值。日志管理器配置文件将默认的控制台处理器的日
志级别设置为java.util.logging.ConsoleHandler.level=INFO - 要想记录FINE级别的日志,就必须修改配置文件中的默认日志记录器级别和处理器级别。另外,还可以绕过配置文件,安装你自己的处理器。
Logger logger = Logger.getLogger("com.mycompany.myapp");logger.setLevel(Level.FINE);logger.setUseParentHandlers(false); //默认会发到consoleHandler。不设为false,会看到两次消息记录ConsoleHandler handler = new ConsoleHandler();handler.setLevel(Level.FINE);logger.addHandler(handler); //安装自己的处理器logger.fine("a fine message");
- 其它处理器:SocketHantRer将记录发送至l指定的主机和端口。FileHandler将记录收集到文件中。

- 过扩展Handler类或StreamHandler类自定义处理器。
过滤器
- 默认情况下,会根据日志记录的级别进行过滤。
- 每个日志记录器和处理器都有一个可选的过滤器来完成附加的过滤,调用setFilter方法就可以
了。注意,同一时刻最多只能有一个过滤器。 - 要定义一个过滤器,需要实现Filter接口并定义以下方法:
boolean isLoggable(LogRecord record)
格式化器
1.ConsoleHandler类和FileHandler类可以生成文本和XML格式的日志记录。不过,你也可
以自定义格式。这需要扩展Formatter类并覆盖下面这个方法:String format(LogRecord record)。
2. 在format方法中,可能会调用下面这个方法:String formatMessage(LogRecord record)
这个方法对记录中的消息部分进行格式化,将替换参数并应用本地化处理。
3. 调用setFormatter方法将格式化器安装到处理器中。
调试技巧




相关文章:
第7章异常、断言和曰志
Java和C异 在C中,throw说明符在运行时执行。Java在编译时执行。 处理错误 异常处理的任务就是将控制权从产生错误的地方转移到能够处理这种情况的错误处理器。 如果由于出现错误而使得某些操作没有完成,程序应该:返回到一种安全状态&#…...
springboot读取和写入csv文件数据
前言 csv格式的表格,和xls以及xlsx格式的表格有一些不同,不能够直接用处理xls的方式处理csv; 以下我将介绍如何读取并写入csv数据 准备工作 要处理csv格式的表格数据,我们首先需要引入pom.xml的依赖 <dependency><art…...
【产品经理】工作交接
一、前言 相信大家对这样的场景一定不陌生:有一天去找某个业务的负责人,突然被告知调岗了,或是辞职了,更坏的情况是,甚至完全找不到相关人员了,直接导致工作搁置了。这种情况,你应该多少会感到…...
Springer期刊 latex投稿经验分享
Springer Nature期刊的latex模板下载: Download the journal article template package 以MTAP为例(修改之后对修订稿的投递过程) 第一步:将您的文章提交到适当的期刊轨道或特刊。 如有必要,从下拉菜单中更改您提交的文章类型。 然后点击Proceed 第二步: 与您提交的先前修…...
Python 文件读取的练习
读取文本文件 给定一个名为 ‘example.txt’ 的文本文件,编写一段Python代码,读取文件并打印其内容。 行数统计 给定一个名为 ‘example.txt’ 的文本文件,编写一段Python代码,计算文件中的行数。 单词统计 给定一个名为 ‘exam…...
Redis:主从复制_通过此功能实现对内存上的数据更好的保护
什么是主从复制? 简单的意义上来讲就是一个主人带着几个奴隶,奴隶的全部都是主人给他的,刚开始的时候奴隶是一无所有,是主人将自己的一部分给到奴隶了。因此奴隶翻身了,变得有钱了,也就是有一定价值了&…...
LoRA:大模型的低秩自适应微调模型
对于大型模型来说,重新训练所有模型参数的全微调变得不可行。比如GPT-3 175B,模型包含175B个参数吗,无论是微调训练和模型部署,都是不可能的事。所以Microsoft 提出了低秩自适应(Low-Rank Adaptation, LoRA),它冻结了预…...
拼多多买家如何导出“个人中心”订单信息
经常在拼多多买东西,有时候需要把订单的物流信息导出来,方便记录和统计。现介绍如何使用dumuz工具来实现批量下载拼多多订单。 应用功能描述 模拟人工操作拼多多"个人中心-我的订单”订单网页,批量查询获取拼多多自己买的商品的订单数…...
11.计算机基础-计算机网络面试题—基础知识
本文目录如下: 计算机基础-计算机网络 面试题一、基础知识简述 TCP 和 UDP 的区别?http 与 https的区别?Session 和 Cookie 有什么区别?详细描述一下 HTTP 访问一个网站的过程?https 是如何实现加密的?URL是什么&…...
cs109-energy+哈佛大学能源探索项目 Part-1(项目背景)
1、项目概况 1.1 背景和动机 建筑能源性能的问题现在已经成为建筑业主极为关注的问题,因为这直接转化为成本。根据美国能源部的数据,建筑物消耗了美国全部能源的约40%。一些州和市政府采取了建筑节能目标,以减少城市及区域乃至全球的空气污…...
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用 1. 摄像头传感器与数据采集(Camera Sensor and Data Acquisition)1.1 数字摄像头传感器基础(Basics of Digital Camera Sensors)1.1.1 传感器类型&am…...
Fixed Function Shader
Properties 属性 Shader语法不区分大小写 基础的数据类型 如何定义一个属性 属性要在"Properties{}"代码块中定义 Properties{_Color("Main Color",Color) (1,1,1,1)_Shininess("Shininess",range(0,8)) 4_MainTex("MainTex",2D…...
HTML- 标签学习之- 列表、表格
无序列表/有序列表: 标签组成( 无序ul 有序 ol ) -> li 父子级标签, ul只能包含li标签, li标签可以包含任意内容。 自定义列表 dl :自定义列表的整体,用于包裹dt/dd 标签dt:自定义列表主题dd:自定义列表的针对主题的…...
Canal搭建 idea设置及采集数据到kafka
Canal GitHub:https://github.com/alibaba/canal#readme 实时采集工具canal:利用mysql主从复制的原理,slave定期读取master的binarylog对binarylog进行解析。 canal工作原理 canal模拟MySQL slave的交互协议,伪装自己为MySQL slav…...
CentOS7搭建伪分布式Hadoop(全过程2023)
##具体操作目录## 1.配置静态ip2.关闭防火墙3.修改主机名为 *master* ,并重启虚拟机vi /etc/hostname 4.修改主机名与ip映射5.设置SSH免密登录6.安装配置java环境----------------------正式Hadoop配置1.移动安装包到合适位置2.解压安装包并重命名3.配置环境变量4.修…...
Linux中文件描述符fd和文件指针filp的理解
简单归纳:fd只是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。 文件描述符的操作(如: open)返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件…...
CSS color中常用英文色值
常用颜色英文 red green blue magenta yellow chocolate black aquamarine lime fuchsia brass azure brown bronze deeppink aliceblue gray copper coral feldspar orange orchid pink plum quartz purple aliceblue antiquewith blanchedalmond…...
Springboot idea 中 maven配置问题,找不到依赖:Could not find artifact xxxx
现象:当我们从代码仓拉取新项目时,从该项目的开发同事拿到其maven的settings文件,作为项目的maven配置,为了是能找到工程中所依赖的包,能从远程仓下载下来。 然后本地仓的包,也从同事那边拷贝一份过来&…...
编译原理笔记(一)引论
文章目录 1.什么是编译程序2.编译过程和编译程序的结构2.1.编译过程概述2.2.编译程序的结构2.3.编译阶段的组合 3.解释程序和一些软件工具3.1.解释程序3.2.处理源程序的软件工具 4.PL/0语言编译系统 学习总结:这一部分是编译原理的绪论部分内容,对编译程…...
C++ 类和对象下 [补充]
文章目录 友元内部类内部类是外部类的天生友元 匿名对象匿名对象的特性 拷贝对象时的一些编译器优化函数返回值临时空间的存储位置返回值临时空间具有常性 标题相同和不同类型 需要 临时空间 友元 友元函数 重载operator<< 输出自定义类型 比如日期类的这个重载ÿ…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

