第7章异常、断言和曰志

news2024/11/20 21:33:31

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方法将格式化器安装到处理器中。

调试技巧

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGLM + PEFT 进行finetune

一、前言 1.1 硬件需求 注:r 为LoRA 维数大小,p 为前缀词表大小,l 为微调层数,ex/s 为每秒训练的样本数。gradient_accumulation_steps 参数设置为 1。上述结果均来自于单个 Tesla V100 GPU,仅供参考。 1.2 微调方法…

开放原子训练营第一季——铜锁探“密” 圆满落幕!

【开放原子训练营第一季结营总结】——铜锁探“密” 开放原子训练营第一季「铜锁探密」由开放原子开源基金会&铜锁社区共同举办,包含 5 次课程,以“抽丝剥茧,循序渐进,一起揭开商用密码的面纱”为主题,让参与者更加…

c++面向对象之类

一、类的定义 class 类名{成员属性构造函数析构函数成员函数 }Person.h #include <string> #include <iostream> using namespace std;class Person {int m_age;string m_name;Person();Person(int age,string name);~Person();int getAge();void setAge(int age…

蓝鲸平台通过标准运维 API 安装 Agent

目录 一、背景 二、目的 三、创建安装agent流程 四、通过标准运维 API 安装 Agent 五、总结 一、背景 蓝鲸平台正常情况纳管主机需要在节点管理手工安装agent&#xff0c;不能达到完成自动化安装agent的效果。想通过脚本一键安装agent&#xff0c;而不需要在蓝鲸平台进行过…

Golang指针的操作以及常用的指针函数

目录 指针的操作 定义指针 获取变量地址 解引用指针 指针作为函数参数 指针的空值 常用的指针函数 new 函数 make 函数 append 函数 copy 函数 指针的操作 在Go语言中&#xff0c;指针是一种非常重要的类型&#xff0c;可以用来传递变量的地址而不是变量本身。 定…

【leetcode刷题总结】——代码随想录(链表总结)

代码随想录按照数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构&#xff0c;再从简单刷起&#xff0c;做了几个类型题目之后&#xff0c;再慢慢做中等题目、困难题目。 以下是个人刷题总结&#xff0c;官…

多个Node.js版本之间切换

本篇文章会讲windows和Mac系统下实现多个node.js版本之间的切换。 1.windows下采用nvm&#xff08;nvm-window&#xff09; 2.Mac下采用nvm和n 注&#xff1a;window和mac下的nvm地址是不一样的 一、windows系统 什么是nvm&#xff1f; nvm是一个简单的bash脚本&#xff…

真题详解(有限自动机)-软件设计(七十七)

确定有限自动机 和 不确定有限自动机 解析&#xff1a; M1的A当0的时候&#xff0c;会变成A&#xff0c;也可能变成B&#xff0c; 所以M1是不确定有限自动机。 M2的A1的时候只会使A&#xff0c;0的时候只会是B B的0只会是B&#xff0c;1的时候只会是C。 C0的时候只会是B&a…

中小型企业需要“数据防泄露”吗?

数据防泄露是指企业采取的各种管理、技术与监督措施&#xff0c;以防止敏感和关键数据在传输、存储与使用过程中被未经授权访问或窃取&#xff0c;从而导致机密性、完整性或可用性受到损害。 数据防泄露工作通常包括数据分类与风险评估、权限管理与访问控制、加密与安全技术、数…

基于Gabor-小波滤波深度图表面法线的特征提取算法【通过正常Gabor-小波的直方图进行2D或3D特征提取】研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Bean的生命周期揭秘:从诞生到消亡,一个对象的壮丽演绎!

大家好&#xff0c;我是你们的小米。今天我要给大家揭秘一下Java开发中重要的概念——Spring Bean的生命周期。作为Java开发者&#xff0c;无论是在面试还是实际工作中&#xff0c;了解Bean的生命周期都是必备的知识点。让我们一起来深入了解吧&#xff01; 什么是Spring Bean …

【zabbix】PostgreSQL表信息查询收集监控

昨天开发那边给了一个需求&#xff0c;每隔一段时间查询一下数据库某表中的数据是否在最近更新&#xff0c;让我这边做一个监控信息收集 一、agent linux侧配置 这边目前就直接在zabbix上实现&#xff0c;首先就是脚本&#xff0c;我用python2实现 脚本名&#xff1a;check_y…

软件测试学什么——如何才能按时上线?

目录 引言 一、提前介入测试&#xff0c;认真做好需求分析。 二、测试计划没必要花太多精力。 三、测试用例编写 四、测试执行的关键点 五、测试环境 【一套系统提升学习的好资料】 阅读书籍文档 总结 引言 上线&#xff0c;永远是软件测试工程师最关注的问题。 上线…

Linux文件系统学习笔记

笔记 修改文件属性与权限数字修改文件权限符号修改文件权限 目录与文件的意义文件的权限目录的权限 路径 修改文件属性与权限 chgrp:修改用户组 chown:修改拥有者 chmod:修改用户权限 其中修改权限:chmod可以用数字修改或者符号修改 数字修改文件权限 一共有三种身份:拥有者…

freeswitch的2833和inband对接方案

概述 freeswitch支持三种模式的DTMF传输方式&#xff0c;分别时inband、INFO、2833。 在传统的PSTN网络中&#xff0c;所有的DTMF码都是inband模式&#xff0c;所以VOIP网络和PSTN网络对接中&#xff0c;需要将DTMF码做格式转换&#xff0c;通常是2833和inband之间的转换。 …

《思考致富》制造借口是一个根深蒂固的习惯

目录 经典摘录 领导方式有两种 拖拉 决心&#xff1a;克服拖拉的坏习惯&#xff08;通往致富之路的第七步&#xff09; 毅力&#xff1a;催生信念的持久努力&#xff08;通往致富之路的第八步&#xff09; 智囊团的力量&#xff1a;致富驱动力&#xff08;通往致富之路的第…

【分享】你用免费的GPT4了嘛?

哈喽&#xff0c;大家好&#xff0c;我是木易巷~ 现在OpenAI的ChatGPT4需要升级为plus会员使用&#xff0c;对于国内的用户来说&#xff0c;不仅需要魔法&#xff0c;还需要有一张外网的信用卡来开通会员&#xff0c;真的麻烦。 最近木易巷发现了一个项目&#xff0c;是GitHu…

基于欧式距离的聚类算法的Kmeans作业

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 基于欧式距离的聚类算法&#xff0c;其认为两个目标的距离越近&#xff0c;相似度越大。 该实验产生的点为二维空间中的点。 环境配置 java环境&#xff0c;使用原生的Java UI组件JPanel和JFrame 算法原理 基于欧式距离的聚…

问卷调查类型全面解析

调查问卷是从人们那里收集反馈和意见的强大工具。通过提出结构化问题&#xff0c;研究人员、组织和企业可以获得大量有关如何改进产品或服务、解决问题或做出明智决策的信息。但在设计调查问卷之前&#xff0c;必须首先了解不同的类型以及何时使用它们。 1、结构化问卷 结构化…

秀场、卖场、生态场,长沙为何连展会也与众不同?

文 | 智能相对论 作者 | 易不二 第三届长沙国际工程机械展览会已经完美落下帷幕。 依托长沙作为“工程机械之都”的硬核产业实力&#xff0c;又经过了多年耕耘&#xff0c;长沙国际工程机械展已经达到了跻身全球一流展会的水平。 4天的展期里&#xff0c;全球1502家企业参展…