《Java 核心技术 卷1》 笔记 第11章 异常、日志、断言和调试
出现不可预计的问题时,需要进行如下处理:
- 报告错误
- 保存操作结果
- 允许用户退出
本章解决的问题:
- 验证程序正确性
- 记录程序错误
- 调试技巧
11.1 处理异常
程序出现错误时应该:
- 返回安全状态,能让用户执行其他命令
- 允许用户保存所有操作结果,并能够终止程序
程序错误的关注点:
- 用户输入错误
- 不遵循程序要求,语法不正确,程序代码应该检查,如果没有检查,会出现错误(遇到过,没检查到,提示不友好用户投诉的)
- 设备错误
- 硬件不一定能够使用,比如打印机关上了,没纸了(这个处理好IO问题不大)
- 物理限制
- 磁盘满了(遇到过,数据库太大把磁盘占满,搬数据库)
- 代码错误
- 返回了错误的答案,或者错误的调用了其他方法(必然遇到过T T)
11.1.1 异常分类
Throwable下,分为Error和Exception
Exception下,又分爲IOException和RuntimeException
Error: Java运行时的内部错误和资源耗尽错误。这种错误通常是系统宕机级别的,处理起来时间较长。(比如没有磁盘空间了)通常在代码层面无法处理这种错误。
RuntimeException: 程序本身没有问题,IO错误等
常见的运行时异常:
- 数组越界
- 空指针
- 类型转换错误
检查异常:
- 错误URL
- 反射异常
- 读取超出文件尾部的数据
所以非运行时错误,一定是编码问题
11.1.2 声明已检查异常
无法处理的情况,Java方法可以抛出一个异常,告诉编译器要返回什么值,如果没有值,则返回发生的错误。
抛出异常的情况:
(1)调用抛出异常的方法
(2)运行过程中发生错误,抛出已检查异常
(3)程序错误,提供不应该提供的数值,a[-1]=0 会报越界异常
(4)Java 虚拟机和运行库异常
前两种必须捕获,不捕获可能宕机
抛出异常的方式:
Class MyAnimation{
Pubic Image loadImage(String s) throw EOFException,MalformedURLException{}
}
异常处理方式:
捕获:进行处理,展示给用户
抛出:交给上一层级处理
不处理:不可控的Error,或者使用规则限制,不产生额外的异常
特殊要求:
子类异常范围,不能超出父类异常范围
11.1.3 如何抛出异常
假设IO读取数据时不完整,可考虑抛出IOException, API 提议抛出 EOFException
基本格式:
public [返回值] 方法名(参数列表) 抛出列表{throw new XXException();}
11.1.4 创建异常类
有时候,标准异常描述并不能做到清楚具体,或者无法具体定位异常原因,为了进一步了解是程序中的哪一段出现异常,可考虑建立自己的异常类(个人觉得一个是名称识别,另外异常文字之类的可以做特殊处理,让它打印到log对应级别上而非直接输出)。
class FileFormatException extends IOException{public FileFormatException(){}public FileFormatException(String gripe){super(gripe);}
}
然后就可以像IOException一样使用这种异常
public class Main {public static void main(String[] args) throws FontFormatException {Main solution = new Main();solution.test(1);}private void test(int num) throws FontFormatException {if(num==1)throw new FontFormatException("test");}
}
不传之密,异常处理工具,保留一定字数的异常信息(数据库存储大小是有限的):
public class ErrorUtil {public static String exceptionStr(Exception e, int length) {ByteArrayOutputStream baos = new ByteArrayOutputStream();e.printStackTrace(new PrintStream(baos));String exception = baos.toString();String regEx = "Caused by:(.*)";Pattern pat = Pattern.compile(regEx);Matcher mat = pat.matcher(exception);boolean rs = mat.find();if (rs) {if (mat.group(1).length() > length) {return mat.group(1).substring(0, length);} else {return mat.group(1);}} else {if (exception.length() > length) {return exception.substring(0, length);} else {return exception;}}}public static String exceptionStr(Exception e){return exceptionStr(e,800);}public static String getAllException(Exception e){ByteArrayOutputStream baos = new ByteArrayOutputStream();e.printStackTrace(new PrintStream(baos));String exception = baos.toString();String regEx = "Caused by:(.*)";Pattern pat = Pattern.compile(regEx);Matcher mat = pat.matcher(exception);boolean rs = mat.find();if (rs) {return mat.group(1);} else {return exception;}}
}
结合:
public class Main {public static void main(String[] args) {Main solution = new Main();try {solution.test(1);} catch (FontFormatException e) {System.out.println(ErrorUtil.getAllException(e));}}private void test(int num) throws FontFormatException {if(num==1)throw new FontFormatException("test");}
}
相关内容:选择 《Java核心技术 卷1》查找相关笔记
评论
《Java 核心技术 卷1》 笔记 第11章 异常、日志、断言和调试相关推荐
- Java编程思想学习笔记-第11章
<?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...
- Java核心技术卷阅读随笔--第3章【Java 的基本程序设计结构】
3.1 一个简单的Java应用程序 下面看一个最简单的 Java 应用程序,它只发送一条消息到控制台窗口中: 复制代码 public class FirstSample { public static ...
- 《Java核心技术》学习笔记——第8章 泛型程序设计
版权声明:本文为博主ExcelMann的原创文章,未经博主允许不得转载. 第8章 泛型程序设计 作者:ExcelMann,转载需注明. 第8章内容目录: 为什么要使用泛型程序设计 定义简单泛型类 泛型 ...
- Java核心技术卷1——笔记(1)
2019独角兽企业重金招聘Python工程师标准>>> 今天读到卷一中对象与类的相关内容,当中关于对象变量的描述对我还是很有启发的. 第一点: 那就是"一个对象变量并没有实 ...
- Java核心技术卷2 高级特性 学习笔记(5)
参考:Java核心技术卷2 高级特性 第九章 Java技术提供了三种确保安全的机制: 语言设计特性(对数组的边界进行检查,无不受检查的类型转换,无指针算法等). 访问控制机制,用于控制代码能够执行的 ...
- JAVA基础----终弄清java核心技术卷1中的int fourthBitFromRight = (n 0b1000 ) / 0b1000;是怎么回事了。。。
一个关于位与运算的问题 对于<JAVA核心技术 卷1>(第11版) page43 第三章 3.5.8一节中有个描述如下: 如果n是一个整数变量,而二进制表示的n从右边数第四位1,则 int ...
- Java核心技术 卷I:基础知识
第一章 Java程序设计概述 太简单了,直接略过. 1.2 Java"白皮书"的关键术语 简单性:指相对于C++简单(指针.多重继承等),但设计者也并没有试图清楚C++中所有不适当 ...
- Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)
22.一旦获得了一个 Charset,就可以在 Java 的 Unicode 和指定的编码格式之间进行转化,下面以 GBK 和 Unicode 之间做为例子. 从 Unicode 到 GBK: imp ...
- java核心技术卷I 第1-3章 笔记
java核心技术卷I 第1-3章 本书将详细介绍下列内容: ● 面向对象程序设计 ● 反射与代理 ● 接口与内部类 ● 异常处理 ● 泛型程序设计 ● 集合框架 ● 事件监听器模型 ● 使用Swing ...
最新文章
- python3编写简易统计服务器
- Java学习(16)--System 类/Date 类/ Calendar类
- TikTok上市无望?某大厂上海分公司跑路?
- 服务器信息安全策略,信息安全工程师考试重点之定制Web服务器的安全策略和安全机制...
- java lwjgl3_java-LWJGL 3鼠标移动
- TortoiseGit拉取或推送,输入账号密码后提示 HTTP Basic: Access denied fatal: Authentication failed 解决方案...
- 计算机和公文写作买什么资料,公文写作和计算机应用笔试和复习大纲资料.doc...
- antd的table进行列筛选时,更新dataSource,为什么table显示暂无数据?
- 使用anconada 的conda更换环境
- docker-compose安装elk7.1.1版本
- roadhog不是内部或外部命令_git:git 不是内部或外部命令,也不是可运行的程序
- Android -- 自动挂断电话
- nginx.conf添加lua.conf配置
- 科普:为什么DOTA2和LOL没有全图挂
- 分布式架构总汇【转】
- DelayQueue 阻塞队列
- 先验 超验_关于先天、先验、经验和超验的理解
- h3c简单配置包括一些简单vlan原理
- Doxyfile 生成CHM
- vb访问服务器文件,VB6打开远程服务器文件