第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<< 输出自定义类型 比如日期类的这个重载ÿ…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...