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);}}
    }
    

使用异常的技巧

  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);

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

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

相关文章

根据后序和中序求二叉树的先序

代码如下&#xff1a; #include <iostream> using namespace std; const int N 1010; int in_order[N], post_order[N], lch[N], rch[N];int build(int inL, int inR, int postL, int postR) {if (inL > inR)return 0;int root post_order[postR];int k inL;while…

CoreJava 笔记总结-第九章 集合

第九章 集合 文章目录第九章 集合Java集合框架集合接口与实现分离Collection接口迭代器泛型实用方法集合框架中的接口具体集合链表数组列表散列集树集优先队列映射映射的基本操作更新映射条目映射视图弱散列试图链接散列集与映射枚举集与映射标识散列映射视图与包装器小集合子范…

30多岁程序员老W,无奈选择转行!问题出在哪?

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区特邀嘉宾&#xff01;一有一天&#xff0c;一位同事跟我说&#xff1a;老w已经改行做美缝去了&#xff0c;你怎么看&#xff1f;我想了想&#xff0c;说&#xff1a;他大概终于做出了眼下最符合他…

一维前缀和

代码如下&#xff1a; #include <iostream> using namespace std; const int N 1010; int a[N], s[N];int main() {int n;cin >> n;for (int i 1; i < n; i) {cin >> a[i];//原数组s[i] s[i - 1] a[i];}for (int i 1; i < n; i)cout << s[…

HttpClientFactory的套路,你知多少?

背景ASP.NET Core 在 2.1 之后推出了具有弹性 HTTP 请求能力的 HttpClient 工厂类 HttpClientFactory。替换的初衷还是简单摆一下&#xff1a;① using(var client new HttpClient()) 调用的 Dispose() 方法并不会立即释放底层 Socket 连接&#xff0c;新建 Socket 需要时间&a…

CoreJava 笔记总结-第十二章 并发-1

第十二章 并发 线程 package chapter12_concurrent.threads;public class ThreadsTest {public static final int DELAY 10;public static final int STEPS 100;public static final double MAX_AMOUNT 1000;public static void main(String[] args) {var bank new Bank(…

走迷宫-双向bfs解法

双向bfs适用于知道起点和终点的状态下使用&#xff0c;从起点和终点两个方向开始进行搜索&#xff0c;可以非常大的提高单个bfs的搜索效率同样&#xff0c;实现也是通过队列的方式&#xff0c;可以设置两个队列&#xff0c;一个队列保存从起点开始搜索的状态&#xff0c;另一个…

.NET Core开发实战(第16课:选项数据热更新:让服务感知配置的变化)--学习笔记...

16 | 选项数据热更新&#xff1a;让服务感知配置的变化选项框架还有两个关键类型&#xff1a;1、IOptionsMonitor2、IOptionsSnapshot场景&#xff1a;1、范围作用域类型使用 IOptinsSnapshot2、单例服务使用 IOptionsMonitor通过代码更新选项&#xff1a;IPostConfigureOption…

CoreJava 笔记总结-第十二章 并发-2

文章目录第十二章 并发synchronized关键字同步块监视器概念volatile字段final变量原子性死锁线程安全的集合阻塞队列映射条目的原子更新对并发散列映射的批操作并行数组算法同步包装器任务和线程池Callable, FutureExecutor执行器fork-in框架异步计算可完成Future组合可完成Fut…

八数码问题II-bfs和map标记

问题描述&#xff1a; 在33的棋盘上&#xff0c;摆有八个棋子&#xff0c;每个棋子上标有1至8的某一数字。棋盘中留有一个空格&#xff0c;空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是&#xff1a; 给出一种初始布局&#xff08;初始状态&#xff09;和目标布…

华为任职资格_看了华为的任职资格体系,你就明白员工为啥这么拼?

提到华为的18万奋斗者&#xff0c;职场上没人不竖起大拇指。而优秀人才的背后&#xff0c;就像任正非曾说过的那样&#xff0c;华为的成功&#xff0c;很大意义上讲就是人力资源的成功。华为的人力资源管理最有代表性的&#xff0c;除了狼性文化和薪酬绩效外&#xff0c;就是任…

如何使用有序GUID提升数据库读写性能

源宝导读&#xff1a;数据库设计时&#xff0c;经常会使用GUID作为表的主键&#xff0c;但由于GUID的随机性会导致数据库在读写数据时效率严重下降&#xff0c;影响应用程序整体性能。本文将深入探讨如何通过使用有序GUID提升数据读写的性能。一、背景常见的数据库设计是使用连…

八数码问题II-双向bfs和map标记

问题描述&#xff1a; 在33的棋盘上&#xff0c;摆有八个棋子&#xff0c;每个棋子上标有1至8的某一数字。棋盘中留有一个空格&#xff0c;空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是&#xff1a; 给出一种初始布局&#xff08;初始状态&#xff09;和目标布…

MarkDown语法, 快捷键,Dos命令

文章目录MarkDown 语法计算机软件快捷键Dos命令MarkDown 语法 字体: 斜体, 粗体, 删除图片: ![title](link)超链接: [words](link)引用>标题列表表格 名字|性别|生日 31辅导班VS看复旦南开都是vs1ds代码块 分割线*** 计算机软件 系统软件应用软件DOS, Windows, Unix,…

《商业洞察力30讲》学习笔记(上)

【洞察力】| 作者 / Edison Zhou这是恰童鞋骚年的第197篇原创文章学习洞察力&#xff0c;也是新时代IT人员的一门进阶必修课...1学习背景2019年下半年至今&#xff0c;在领导的推荐下学习了刘润老师的《商业洞察力30讲》&#xff0c;刷新了我对于事物的认知&#xff0c;也为我提…

[蓝桥杯][历届试题]九宫重排-双向bfs和map标记

题目描述 如下面第一个图的九宫格中&#xff0c;放着 1~8 的数字卡片&#xff0c;还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动&#xff0c;可以形成第二个图所示的局面。 我们把第一个图的局面记为&#xff1a;12345678. 把第二个图的局面记…

3月数据库排行:前10整体下行,出新技术了?

DB-Engines 数据库流行度排行榜 3 月更新已发布&#xff0c;排名前二十如下&#xff1a;排名方面没有任何变动&#xff08;仅针对前十&#xff09;&#xff0c;相信很长一段时间内也都不会变动&#xff0c;毕竟巨头的位置不是一时半刻就能动摇的。不过这个月的排行榜还是有值得…

CSS3动画大全(附源码)flex布局,grid布局3d旋转,图像模糊,文字发光

CSS3动画大全(附源码)3d旋转,图像模糊,文字发光! 文章目录CSS3动画大全(附源码)3d旋转,图像模糊,文字发光!html代码cssgrid布局flex布局文字发光 & 图像放缩3d旋转 图像移动源码html代码 <body><div class"container"><div class"main"…

每日一题——LeetCode160.相交链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1&#xff1a;示例2&#xff1a;提示&#xff1a; 2. 思路3. 代码 1. 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的…

[蓝桥杯][2013年第四届真题]买不到的数目-模拟,数论

题目描述 小明开了一家糖果店。他别出心裁&#xff1a;把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。 小朋友来买糖的时候&#xff0c;他就用这两种包装来组合。当然有些糖果数目是无法组合出来的&#xff0c;比如要买 10 颗糖。 你可以用计算机测试一下&#xff0c;在…