当前位置: 首页 > news >正文

第7章异常、断言和曰志

Java和C++异

  1. 在C++中,throw说明符在运行时执行。Java在编译时执行。

处理错误

  1. 异常处理的任务就是将控制权从产生错误的地方转移到能够处理这种情况的错误处理器

  2. 如果由于出现错误而使得某些操作没有完成,程序应该:返回到一种安全状态,并能够让用户执行其他的命令;或者允许用户保存所有工作的结果,并以妥善的方式终止程序

  3. 程序中可能会出现的错误和问题

  • 用户输入错误
  • 设备错误。如打印机在打印过程中可能没有纸了。
  • 物理限制。磁盘已满。
  • 代码错误。数组越界。
  1. 某个抛出 (throw) 一个封装了错误信息的对象。需要注意的是,这个方法将会立刻退出,并不返回正常值(或任何值)。此外,也不会从调用这个方法的代码继续执行,取而代之的是,异常处理机制开始搜索能够处理这种异常状况的异常处理器(exception handler)。

异常分类

  1. 所有的异常都是由Throwable继承而来。
  2. 在下一层立即分解为两个分支:Error 和 Exception。Error类层次结构描述了 Java运行时系统的内部错误和资源耗尽错误。你的应用程序不应该抛出这种类型的对象。如果出现了这样的内部错误,除了通知用户,并尽力妥善地终止程序之外,你几乎无能为力。这种情况很少出现。
  3. Exception层次结构又分解为两个分支:一个分支派生于RuntimeException ;另一个分支包含其他异常。一般规则是:由编程错误导致的异常属于RuntimeException ;如果程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常。

派生于RuntimeException的异常包括以下问题:

  • 错误的强制类型转换。
  • 数组访问越界。
  • 访问null指针。
    不是派生于RuntimeException的异常包括:
  • 试图超越文件末尾继续读取数据。
  • 试图打开一个不存在的文件
  • 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在
  1. 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)是程序执行过程中某个特定点上所有挂起的方法调用的一个列表。

访问堆栈轨迹的文本描述信息

  1. Throwable类的printStackTrace
var t = new Throwable();
var out = new StringWriterf);
t.printStackTrace(new PrintWriter(out));
String description = out.toStringl);
  1. StackWalker类
    在这里插入图片描述

使用异常的技巧

  1. 异常处理不能代替简单的测试。
  2. 不要过分地细化异常。
  3. 充分利用异常层次结构。
  4. 不要压制异常。
  5. 在检测错误时,“苛刻”要比放任更好。
  6. 不要羞于传递异常。

注释:规则5、6可以归纳为“早抛出,晚捕获”。

使用断言

断言的概念

断言机制允许在测试期间向代码中插人一些检查,而在生产代码中会自动删除这些检查。
在这里插入图片描述

启用和禁用断言

  1. 不必重新编译程序来启用或禁用断言。启用或禁用断言是类加载器的功能。
  2. 可以使用开关有选择地启用或禁用某个特定类和包中的断言。

使用断言完成参数检查

Java中3种处理系统错误的机制:

  1. 抛异常
  2. 日志
  3. 断言

什么时候应该选择使用断言呢?

  1. 断言失败是致命的、不可恢复的错误。
  2. 断言检查只是在开发和测试阶段打开。

日志

日志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
  1. 默认情况下,只记录前3个级别。
  2. 应该使用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

处理器

  1. 在默认情况下,日志记录器将记录发送到ConsoleHandler ,并由它输出到System.err流。
  2. 与日志记录器一样,处理器也有日志级别。对于一个要记录的日志记录,它的日志级别
    必须高于日志记录器和处理器二者的阈值。日志管理器配置文件将默认的控制台处理器的日
    志级别设置为java.util.logging.ConsoleHandler.level=INFO
  3. 要想记录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");
  1. 其它处理器:SocketHantRer将记录发送至l指定的主机和端口。FileHandler将记录收集到文件中。
  2. 过扩展Handler类或StreamHandler类自定义处理器。

过滤器

  1. 默认情况下,会根据日志记录的级别进行过滤。
  2. 每个日志记录器和处理器都有一个可选的过滤器来完成附加的过滤,调用setFilter方法就可以
    了。注意,同一时刻最多只能有一个过滤器。
  3. 要定义一个过滤器,需要实现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格式的表格&#xff0c;和xls以及xlsx格式的表格有一些不同&#xff0c;不能够直接用处理xls的方式处理csv&#xff1b; 以下我将介绍如何读取并写入csv数据 准备工作 要处理csv格式的表格数据&#xff0c;我们首先需要引入pom.xml的依赖 <dependency><art…...

【产品经理】工作交接

一、前言 相信大家对这样的场景一定不陌生&#xff1a;有一天去找某个业务的负责人&#xff0c;突然被告知调岗了&#xff0c;或是辞职了&#xff0c;更坏的情况是&#xff0c;甚至完全找不到相关人员了&#xff0c;直接导致工作搁置了。这种情况&#xff0c;你应该多少会感到…...

Springer期刊 latex投稿经验分享

Springer Nature期刊的latex模板下载: Download the journal article template package 以MTAP为例(修改之后对修订稿的投递过程) 第一步:将您的文章提交到适当的期刊轨道或特刊。 如有必要,从下拉菜单中更改您提交的文章类型。 然后点击Proceed 第二步: 与您提交的先前修…...

Python 文件读取的练习

读取文本文件 给定一个名为 ‘example.txt’ 的文本文件&#xff0c;编写一段Python代码&#xff0c;读取文件并打印其内容。 行数统计 给定一个名为 ‘example.txt’ 的文本文件&#xff0c;编写一段Python代码&#xff0c;计算文件中的行数。 单词统计 给定一个名为 ‘exam…...

Redis:主从复制_通过此功能实现对内存上的数据更好的保护

什么是主从复制&#xff1f; 简单的意义上来讲就是一个主人带着几个奴隶&#xff0c;奴隶的全部都是主人给他的&#xff0c;刚开始的时候奴隶是一无所有&#xff0c;是主人将自己的一部分给到奴隶了。因此奴隶翻身了&#xff0c;变得有钱了&#xff0c;也就是有一定价值了&…...

LoRA:大模型的低秩自适应微调模型

对于大型模型来说&#xff0c;重新训练所有模型参数的全微调变得不可行。比如GPT-3 175B&#xff0c;模型包含175B个参数吗&#xff0c;无论是微调训练和模型部署&#xff0c;都是不可能的事。所以Microsoft 提出了低秩自适应(Low-Rank Adaptation, LoRA)&#xff0c;它冻结了预…...

拼多多买家如何导出“个人中心”订单信息

经常在拼多多买东西&#xff0c;有时候需要把订单的物流信息导出来&#xff0c;方便记录和统计。现介绍如何使用dumuz工具来实现批量下载拼多多订单。 应用功能描述 模拟人工操作拼多多"个人中心-我的订单”订单网页&#xff0c;批量查询获取拼多多自己买的商品的订单数…...

11.计算机基础-计算机网络面试题—基础知识

本文目录如下&#xff1a; 计算机基础-计算机网络 面试题一、基础知识简述 TCP 和 UDP 的区别&#xff1f;http 与 https的区别?Session 和 Cookie 有什么区别&#xff1f;详细描述一下 HTTP 访问一个网站的过程&#xff1f;https 是如何实现加密的&#xff1f;URL是什么&…...

cs109-energy+哈佛大学能源探索项目 Part-1(项目背景)

1、项目概况 1.1 背景和动机 建筑能源性能的问题现在已经成为建筑业主极为关注的问题&#xff0c;因为这直接转化为成本。根据美国能源部的数据&#xff0c;建筑物消耗了美国全部能源的约40%。一些州和市政府采取了建筑节能目标&#xff0c;以减少城市及区域乃至全球的空气污…...

ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用

ARM Linux摄像头传感器数据处理全景视野&#xff1a;从板端编码视频到高级应用 1. 摄像头传感器与数据采集&#xff08;Camera Sensor and Data Acquisition&#xff09;1.1 数字摄像头传感器基础&#xff08;Basics of Digital Camera Sensors&#xff09;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- 标签学习之- 列表、表格

无序列表/有序列表&#xff1a; 标签组成( 无序ul 有序 ol ) -> li 父子级标签&#xff0c; ul只能包含li标签&#xff0c; li标签可以包含任意内容。 自定义列表 dl :自定义列表的整体&#xff0c;用于包裹dt/dd 标签dt:自定义列表主题dd:自定义列表的针对主题的…...

Canal搭建 idea设置及采集数据到kafka

Canal GitHub&#xff1a;https://github.com/alibaba/canal#readme 实时采集工具canal&#xff1a;利用mysql主从复制的原理&#xff0c;slave定期读取master的binarylog对binarylog进行解析。 canal工作原理 canal模拟MySQL slave的交互协议&#xff0c;伪装自己为MySQL slav…...

CentOS7搭建伪分布式Hadoop(全过程2023)

##具体操作目录## 1.配置静态ip2.关闭防火墙3.修改主机名为 *master* &#xff0c;并重启虚拟机vi /etc/hostname 4.修改主机名与ip映射5.设置SSH免密登录6.安装配置java环境----------------------正式Hadoop配置1.移动安装包到合适位置2.解压安装包并重命名3.配置环境变量4.修…...

Linux中文件描述符fd和文件指针filp的理解

简单归纳&#xff1a;fd只是一个整数&#xff0c;在open时产生。起到一个索引的作用&#xff0c;进程通过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

现象&#xff1a;当我们从代码仓拉取新项目时&#xff0c;从该项目的开发同事拿到其maven的settings文件&#xff0c;作为项目的maven配置&#xff0c;为了是能找到工程中所依赖的包&#xff0c;能从远程仓下载下来。 然后本地仓的包&#xff0c;也从同事那边拷贝一份过来&…...

编译原理笔记(一)引论

文章目录 1.什么是编译程序2.编译过程和编译程序的结构2.1.编译过程概述2.2.编译程序的结构2.3.编译阶段的组合 3.解释程序和一些软件工具3.1.解释程序3.2.处理源程序的软件工具 4.PL/0语言编译系统 学习总结&#xff1a;这一部分是编译原理的绪论部分内容&#xff0c;对编译程…...

C++ 类和对象下 [补充]

文章目录 友元内部类内部类是外部类的天生友元 匿名对象匿名对象的特性 拷贝对象时的一些编译器优化函数返回值临时空间的存储位置返回值临时空间具有常性 标题相同和不同类型 需要 临时空间 友元 友元函数 重载operator<< 输出自定义类型 比如日期类的这个重载&#xff…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...