文章目录

  • 第七章 异常,断言和日志
    • 处理错误
      • 异常的分类
      • 声明检查型异常
      • 如何抛出异常
      • 创建异常类
    • 捕获异常
      • 捕获单个异常
      • 捕获多个异常
      • 再次抛出异常和异常链
      • `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);}}
    }
    

使用异常的技巧

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

使用断言

  • 断言:允许在测试期间在代码中插入一些检查,而在生产代码中会自动删除这些检查
  • 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

调试技巧

  1. System.out.println("x=" + x); ``Logger.getGlobal().info("x=" + x);``Logger.getGlobal().info("this=" + this);打印或者记录任意变量的值
  2. 每一个类中单独放置main方法
  3. 日志代理:一个子类对象,截获方法调用,记录日志,调用超类中的方法.
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
*/
  1. 利用Throwable类的printStackTrace方法,可以从任意异常对象获得堆栈轨迹
try{...
}
catch(Throwable t){t.printStackTrace();throw t;
}或者:
Thread.dumpStack();
  1. 堆栈轨迹一般显示在System.err上.想要记录或者显示堆栈轨迹,可以捕获进入一个字符串

    import java.io.*;

var out = new StringWriter();
new Throwable().printStackTrace(new PrintWriter(out));
String description = out.toString();
//System.out.println(description);

CoreJava 笔记总结-第七章 异常,断言和日志相关推荐

  1. Core Java 读后感 - 第七章 异常、断言和日志

    第七章 异常.断言和日志 7.1 处理异常 如果由于出现错误使得某些操作没有完成, 程序应该: 返回到一种安全状态,并能够让用户执行其他命令 允许用户保存所有工作的结果,并以妥善的方式终止程序 异常处 ...

  2. CoreJava 笔记总结-第三章 Java的基本程序设计结构

    CoreJava 笔记总结 文章目录 CoreJava 笔记总结 第三章 Java的基本程序设计结构 数据类型 1. 整型 2. 浮点类型 3. char类型 4. boolean类型 变量与常量 1 ...

  3. PMBOK(第六版) 学习笔记 ——《第七章 项目成本管理》

    系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...

  4. 【PaddleSpeech-学习笔记】第七章:声音合成

    [PaddleSpeech-学习笔记]第七章:声音合成 人类通过听觉获取的信息大概占所有感知信息的20%~30%. 声音储存了丰富的语义与时序信息,由专门负责听觉的器官接收信号,产生一系列连锁刺激后, ...

  5. 李弘毅机器学习笔记:第七章—深度学习的发展趋势

    李弘毅机器学习笔记:第七章-深度学习的发展趋势 回顾一下deep learning的历史: 1958: Perceptron (linear model) 1969: Perceptron has l ...

  6. 《Python基础教程(第3版)》笔记:第8章异常

    <Python基础教程(第3版)>笔记:异常 重点 第8章 异常 异常对象未被处理(或捕获)时,程序将终止并显示一条错误信息:traceback 每个异常都是某个类的实例, 如何创建异常 ...

  7. 《计算传播学导论》读书笔记:第七章 数据新闻

    目录 第七章 数据新闻 第一节 产生背景 第二节 理论源流 一.计算驱动的新闻报道 二.可视化驱动的新闻报道 三.制作流程 第三节 实战练习 一.维基解密阿富汗战争日志 二.奥运会数据分析和EChar ...

  8. 2020年PMP笔记归纳第七章项目成本管理

    学习目标: 掌握项目成本管理 学习内容: 章节内容 7.1 规划成本管理 7.2 估算成本 7.3 制定预算 7.4 控制成本 第七章PMBOK概述中的重点内容 项目成本管理包括为使项目在批准的预算内 ...

  9. 《网络安全工程师笔记》 第七章:NTFS安全权限

    注:本笔记来自温晓飞老师的网络安全课程 第七章:NTFS安全权限 第一章:虚拟化架构与系统部署 第二章:IP地址详解 第三章:进制转换 第四章:DOS基本命令与批处理 第五章:用户与组管理 第六章:服 ...

最新文章

  1. iphone照片删掉又出现_iPhone 内存不够用,原因在这儿!
  2. java将数据从外部读入到程序称为_java复习与练习答案beta3(基本可信~~)
  3. 如何截取滚动的页面,窗口
  4. springmvc05 传值
  5. myeclipse 扩展内存大小
  6. C++ 读取txt文件方法读取速度比较
  7. java实现文件的复制
  8. 单舵轮(叉车)AGV里程计数据解算
  9. linux中测试环境的搭建
  10. QQ VS 360事件全部经过!-----现实生活中的MBA经典案例!
  11. 清华大学计算机系张昕,程序设计语言的研究与发展——如何推进国内程序设计语言的教育和研究?丨CNCC技术论坛...
  12. Kali 编译 Android 源码
  13. 网站设计的思路是怎么样的?如何设计一个好网站?|优漫动游
  14. 网络适配器消失不见?
  15. Linux安装zabbix4
  16. AD与AAD区别和联系
  17. Linux服务器下载日志到本地
  18. springboot 使用Druid数据库连接池
  19. IJCAI-18 阿里妈妈广告转化预测
  20. java基础—java.io.FileNotFoundException: D:\\AAA(拒绝访问。)

热门文章

  1. oracle 48小时内_近了近了,内马尔正大步向巴萨走来,西媒称有望48小时内敲定转会...
  2. 山西最值得一去的5座古镇,你都去过吗?
  3. 地球上这10个奇幻景观,带你踏入外太空
  4. Python的这几个常用库,你会用吗?
  5. 我用Python爬取了14年所有的福彩3D信息,彩民们,只能帮你们到这了
  6. 100例经典炒菜_Python3经典100例(②)
  7. 备赛脱脂经验分享_IEO国际经济学奥林匹克初选宏观备赛经验分享
  8. 大数据财税与python应用_大数据跟python
  9. 51单片机外部地址c语言,cx51与c语言对单片机内部和外部资源变量和地址的定义是否兼容?为什么...
  10. jpa 定义中间表实体_Spring Data JPA实体详解