出现不可预计的问题时,需要进行如下处理:

  1. 报告错误
  2. 保存操作结果
  3. 允许用户退出

本章解决的问题:

  • 验证程序正确性
  • 记录程序错误
  • 调试技巧

11.1 处理异常

程序出现错误时应该:

  • 返回安全状态,能让用户执行其他命令
  • 允许用户保存所有操作结果,并能够终止程序

程序错误的关注点:

  1. 用户输入错误

    1. 不遵循程序要求,语法不正确,程序代码应该检查,如果没有检查,会出现错误(遇到过,没检查到,提示不友好用户投诉的)
  2. 设备错误
    1. 硬件不一定能够使用,比如打印机关上了,没纸了(这个处理好IO问题不大)
  3. 物理限制
    1. 磁盘满了(遇到过,数据库太大把磁盘占满,搬数据库)
  4. 代码错误
    1. 返回了错误的答案,或者错误的调用了其他方法(必然遇到过T T)

11.1.1 异常分类

Throwable下,分为Error和Exception

Exception下,又分爲IOException和RuntimeException

Error: Java运行时的内部错误和资源耗尽错误。这种错误通常是系统宕机级别的,处理起来时间较长。(比如没有磁盘空间了)通常在代码层面无法处理这种错误。

RuntimeException: 程序本身没有问题,IO错误等

常见的运行时异常:

  1. 数组越界
  2. 空指针
  3. 类型转换错误

检查异常:

  1. 错误URL
  2. 反射异常
  3. 读取超出文件尾部的数据

所以非运行时错误,一定是编码问题

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章 异常、日志、断言和调试相关推荐

  1. Java编程思想学习笔记-第11章

    <?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...

  2. Java核心技术卷阅读随笔--第3章【Java 的基本程序设计结构】

    3.1 一个简单的Java应用程序 下面看一个最简单的 Java 应用程序,它只发送一条消息到控制台窗口中: 复制代码 public class FirstSample { public static ...

  3. 《Java核心技术》学习笔记——第8章 泛型程序设计

    版权声明:本文为博主ExcelMann的原创文章,未经博主允许不得转载. 第8章 泛型程序设计 作者:ExcelMann,转载需注明. 第8章内容目录: 为什么要使用泛型程序设计 定义简单泛型类 泛型 ...

  4. Java核心技术卷1——笔记(1)

    2019独角兽企业重金招聘Python工程师标准>>> 今天读到卷一中对象与类的相关内容,当中关于对象变量的描述对我还是很有启发的. 第一点: 那就是"一个对象变量并没有实 ...

  5. Java核心技术卷2 高级特性 学习笔记(5)

    参考:Java核心技术卷2 高级特性  第九章 Java技术提供了三种确保安全的机制: 语言设计特性(对数组的边界进行检查,无不受检查的类型转换,无指针算法等). 访问控制机制,用于控制代码能够执行的 ...

  6. JAVA基础----终弄清java核心技术卷1中的int fourthBitFromRight = (n 0b1000 ) / 0b1000;是怎么回事了。。。

    一个关于位与运算的问题 对于<JAVA核心技术 卷1>(第11版) page43 第三章 3.5.8一节中有个描述如下: 如果n是一个整数变量,而二进制表示的n从右边数第四位1,则 int ...

  7. Java核心技术 卷I:基础知识

    第一章 Java程序设计概述 太简单了,直接略过. 1.2 Java"白皮书"的关键术语 简单性:指相对于C++简单(指针.多重继承等),但设计者也并没有试图清楚C++中所有不适当 ...

  8. Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)

    22.一旦获得了一个 Charset,就可以在 Java 的 Unicode 和指定的编码格式之间进行转化,下面以 GBK 和 Unicode 之间做为例子. 从 Unicode 到 GBK: imp ...

  9. java核心技术卷I 第1-3章 笔记

    java核心技术卷I 第1-3章 本书将详细介绍下列内容: ● 面向对象程序设计 ● 反射与代理 ● 接口与内部类 ● 异常处理 ● 泛型程序设计 ● 集合框架 ● 事件监听器模型 ● 使用Swing ...

最新文章

  1. python3编写简易统计服务器
  2. Java学习(16)--System 类/Date 类/ Calendar类
  3. TikTok上市无望?某大厂上海分公司跑路?
  4. 服务器信息安全策略,信息安全工程师考试重点之定制Web服务器的安全策略和安全机制...
  5. java lwjgl3_java-LWJGL 3鼠标移动
  6. TortoiseGit拉取或推送,输入账号密码后提示 HTTP Basic: Access denied fatal: Authentication failed 解决方案...
  7. 计算机和公文写作买什么资料,公文写作和计算机应用笔试和复习大纲资料.doc...
  8. antd的table进行列筛选时,更新dataSource,为什么table显示暂无数据?
  9. 使用anconada 的conda更换环境
  10. docker-compose安装elk7.1.1版本
  11. roadhog不是内部或外部命令_git:git 不是内部或外部命令,也不是可运行的程序
  12. Android -- 自动挂断电话
  13. nginx.conf添加lua.conf配置
  14. 科普:为什么DOTA2和LOL没有全图挂
  15. 分布式架构总汇【转】
  16. DelayQueue 阻塞队列
  17. 先验 超验_关于先天、先验、经验和超验的理解
  18. h3c简单配置包括一些简单vlan原理
  19. Doxyfile 生成CHM
  20. vb访问服务器文件,VB6打开远程服务器文件

热门文章

  1. html显示下滑线,html超链接添加下划线
  2. 未来计算机的应用方向,计算机应用现状及未来方向
  3. iOS8 对开发人员来说意味着什么?
  4. Python库的使用
  5. The Controller Placement Problem in Software Defined Networking
  6. ios 渐变透明背景_PS教程丨扣出透明的玻璃瓶
  7. css背景透明文子不透明,CSS 实现背景透明 内容文字不透明 显示
  8. 自然网络语言模型(NNLM)
  9. 数据探索简介——质量分析、特征分析
  10. 基于华为云区块链服务快速部署和搭建链上应用