CoreJava 笔记总结-第七章 异常,断言和日志
文章目录
- 第七章 异常,断言和日志
- 处理错误
- 异常的分类
- 声明检查型异常
- 如何抛出异常
- 创建异常类
- 捕获异常
- 捕获单个异常
- 捕获多个异常
- 再次抛出异常和异常链
- `finally`子句
- `try-with-Resource`语句
- 分析堆栈轨迹元素
- 使用异常的技巧
- 使用断言
- 使用断言完成参数检查
- 日志
- 基本日志
- 高级日志
- 调试技巧
第七章 异常,断言和日志
处理错误
异常的分类
- 异常对象都是派生于
Throwable
类的一个类实例 - 下一层:
Error
:描述java运行时系统内部错误或者资源耗尽错误Exception
: 其他异常(IOException
),RuntimeException
(编程错误导致的异常) RuntimeException:
错误的强制类型转换,数组访问越界,访问null指针- 非检查型异常:
Error, RuntimeException
, 其他的异常称为检查型异常
声明检查型异常
- 一个方法必须声明所有可能抛出的检查型异常,而非检查型异常:
Error
在控制之外,RuntimeException
一开始就应该避免的情况 - 子类中覆盖了超类的一个方法,子类中声明的检查型异常必须特殊性大于等于超类中的(不抛出或者抛出更加特殊的异常)
如何抛出异常
方法: 找到一个合适的异常类–>创建这个类的一个对象–>将对象抛出
throw new EDFException
var e = new EDFException(); throw e;
throw new EOFException(string)
创建异常类
定义一个派生于
Exception
的类或者其子类,包含两个构造器:默认构造器和一个包含详细描述信息的构造器class FileFormatException extends IOException {public FileFormatException(){}public FileFormatException(Strig gripe){super(gripe);} }
捕获异常
捕获单个异常
try{codemore code } catch(ExceptionType e){handle for this type }
捕获知道怎么处理的异常, 传播不知道如何处理的异常
public void read(String filename){try{var in = new FileInputStream(filename);int b;while((b = in.read())!= -1){...}}catch(IOException exception){exception.printStackTrace();} }public void read(String filename) throws IOException {var in = new FileInputStream(filename);int b;while((b = in.read())!= -1){...} }
子类方法覆盖超类,超类没有抛出异常,子类必须捕获
捕获多个异常
try{codemore code } catch(FileNotFoundException e){emergency action for missing files } catch(UnknowHostException e){emergency action for unknow hosts } catch(IOException | ExceotionType e){emergency action for all i/o problems }
e.getMessage()
获取错误信息e.getClass().getName()
获得异常对象实际类型
再次抛出异常和异常链
- 将原始异常设置为新异常的原因
- 子系统中抛出高层异常,而不会丢失原始异常的细节
- 可以将检查型异常包装为非检查型异常
finally
子句
try{.. } catch{... } finally{... }
finally
子句中的代码一定会执行,可以没有catch
子句不要把改变控制流的语句
return , throw, continue, break
放在finally
子句中
try-with-Resource
语句
try(Resource res= . . .){work with res }
try块自动退出时,自动调用
res,close()
分析堆栈轨迹元素
package chapter7_exception_assertion_logger.stackTrace;import java.util.Scanner;public class StackTraceTest {//阶乘public static int factorial(int n) {System.out.println("factorial(" + n + "):");var walker = StackWalker.getInstance();walker.forEach(System.out::println);int r;if (n <= 1) {r = 1;} else {r = n * factorial(n - 1);}System.out.println("return " + r);return r;}public static void main(String[] args) {try (var in = new Scanner(System.in)){System.out.println("Enter n: ");int n = in.nextInt();factorial(n);}} }
使用异常的技巧
- 异常处理不能代替简单测试
- 不要过分细化异常
- 充分利用异常层次结构
- 不要压制异常
- 在检查错误时,"苛刻"要比放任好
- 不要羞于传递异常
使用断言
- 断言:允许在测试期间在代码中插入一些检查,而在生产代码中会自动删除这些检查
assert condition;
assert condition: expression;
使用断言完成参数检查
断言使用规则: 断言失败是致命的,不可恢复的错误; 断言只是在开法和测试阶段打开
assert a!= null;
3种处理系统错误的机制: 抛出异常,断言,日志
日志
基本日志
生成简单的日志,使用全局日志记录器
Logger.getGlobal().info("File->Open menu item selected");
9月 05, 2021 11:24:59 上午 chapter7_exception_assertion_logger.test.log main 信息: File->Open menu item selected.
Logger.getGlobal().setLevel(Level.OFF)
将会取消所有的日志
高级日志
- P306
调试技巧
- 用
System.out.println("x=" + x); ``Logger.getGlobal().info("x=" + x);``Logger.getGlobal().info("this=" + this);
打印或者记录任意变量的值 - 每一个类中单独放置
main
方法 - 日志代理:一个子类对象,截获方法调用,记录日志,调用超类中的方法.
var generator = new Random(){public double nextDouble(){double result = super.nextDouble();Logger.getGlobal().info("nextDouble: " + result);return result;}
};System.out.println(generator.nextDouble());
/*
9月 05, 2021 11:48:19 上午 chapter7_exception_assertion_logger.test.log$1 nextDouble
信息: nextDouble: 0.8803807382089267
0.8803807382089267
*/
- 利用
Throwable
类的printStackTrace
方法,可以从任意异常对象获得堆栈轨迹
try{...
}
catch(Throwable t){t.printStackTrace();throw t;
}或者:
Thread.dumpStack();
堆栈轨迹一般显示在
System.err
上.想要记录或者显示堆栈轨迹,可以捕获进入一个字符串import java.io.*;
var out = new StringWriter();
new Throwable().printStackTrace(new PrintWriter(out));
String description = out.toString();
//System.out.println(description);
CoreJava 笔记总结-第七章 异常,断言和日志相关推荐
- Core Java 读后感 - 第七章 异常、断言和日志
第七章 异常.断言和日志 7.1 处理异常 如果由于出现错误使得某些操作没有完成, 程序应该: 返回到一种安全状态,并能够让用户执行其他命令 允许用户保存所有工作的结果,并以妥善的方式终止程序 异常处 ...
- CoreJava 笔记总结-第三章 Java的基本程序设计结构
CoreJava 笔记总结 文章目录 CoreJava 笔记总结 第三章 Java的基本程序设计结构 数据类型 1. 整型 2. 浮点类型 3. char类型 4. boolean类型 变量与常量 1 ...
- PMBOK(第六版) 学习笔记 ——《第七章 项目成本管理》
系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...
- 【PaddleSpeech-学习笔记】第七章:声音合成
[PaddleSpeech-学习笔记]第七章:声音合成 人类通过听觉获取的信息大概占所有感知信息的20%~30%. 声音储存了丰富的语义与时序信息,由专门负责听觉的器官接收信号,产生一系列连锁刺激后, ...
- 李弘毅机器学习笔记:第七章—深度学习的发展趋势
李弘毅机器学习笔记:第七章-深度学习的发展趋势 回顾一下deep learning的历史: 1958: Perceptron (linear model) 1969: Perceptron has l ...
- 《Python基础教程(第3版)》笔记:第8章异常
<Python基础教程(第3版)>笔记:异常 重点 第8章 异常 异常对象未被处理(或捕获)时,程序将终止并显示一条错误信息:traceback 每个异常都是某个类的实例, 如何创建异常 ...
- 《计算传播学导论》读书笔记:第七章 数据新闻
目录 第七章 数据新闻 第一节 产生背景 第二节 理论源流 一.计算驱动的新闻报道 二.可视化驱动的新闻报道 三.制作流程 第三节 实战练习 一.维基解密阿富汗战争日志 二.奥运会数据分析和EChar ...
- 2020年PMP笔记归纳第七章项目成本管理
学习目标: 掌握项目成本管理 学习内容: 章节内容 7.1 规划成本管理 7.2 估算成本 7.3 制定预算 7.4 控制成本 第七章PMBOK概述中的重点内容 项目成本管理包括为使项目在批准的预算内 ...
- 《网络安全工程师笔记》 第七章:NTFS安全权限
注:本笔记来自温晓飞老师的网络安全课程 第七章:NTFS安全权限 第一章:虚拟化架构与系统部署 第二章:IP地址详解 第三章:进制转换 第四章:DOS基本命令与批处理 第五章:用户与组管理 第六章:服 ...
最新文章
- iphone照片删掉又出现_iPhone 内存不够用,原因在这儿!
- java将数据从外部读入到程序称为_java复习与练习答案beta3(基本可信~~)
- 如何截取滚动的页面,窗口
- springmvc05 传值
- myeclipse 扩展内存大小
- C++ 读取txt文件方法读取速度比较
- java实现文件的复制
- 单舵轮(叉车)AGV里程计数据解算
- linux中测试环境的搭建
- QQ VS 360事件全部经过!-----现实生活中的MBA经典案例!
- 清华大学计算机系张昕,程序设计语言的研究与发展——如何推进国内程序设计语言的教育和研究?丨CNCC技术论坛...
- Kali 编译 Android 源码
- 网站设计的思路是怎么样的?如何设计一个好网站?|优漫动游
- 网络适配器消失不见?
- Linux安装zabbix4
- AD与AAD区别和联系
- Linux服务器下载日志到本地
- springboot 使用Druid数据库连接池
- IJCAI-18 阿里妈妈广告转化预测
- java基础—java.io.FileNotFoundException: D:\\AAA(拒绝访问。)
热门文章
- oracle 48小时内_近了近了,内马尔正大步向巴萨走来,西媒称有望48小时内敲定转会...
- 山西最值得一去的5座古镇,你都去过吗?
- 地球上这10个奇幻景观,带你踏入外太空
- Python的这几个常用库,你会用吗?
- 我用Python爬取了14年所有的福彩3D信息,彩民们,只能帮你们到这了
- 100例经典炒菜_Python3经典100例(②)
- 备赛脱脂经验分享_IEO国际经济学奥林匹克初选宏观备赛经验分享
- 大数据财税与python应用_大数据跟python
- 51单片机外部地址c语言,cx51与c语言对单片机内部和外部资源变量和地址的定义是否兼容?为什么...
- jpa 定义中间表实体_Spring Data JPA实体详解