Java核心技术 2讲

Question 1:
Exception和Error的区别?
Question 2:
运行时异常和一般异常有何区别?
Exception类和Error类都继承了Throwable类,在Java中只有Throwable类中的实例才能被抛出(throw)和捕获(catch),它是异常处理机制的基本组成类型。

Exception和Error体现了Java平台设计者对不同异常情况的分类。
Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
Error是正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序处于非正常情况,所以不会被捕获。如OutofMemoryError之类的子类。
Exception又分为可检查(checked)异常和不检查(unchecked)异常。
可检查异常在源代码里必须显示地进行捕获处理,这是编译期检查的一部分。
不检查异常就是所谓的运行时异常,类似NullPointException、ArrayIndexOutOfBoundsException之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。

掌握异常需要掌握的两个方面:
1.理解Throwable、Exception、Error的设计和分类。掌握应用最广泛的那些子类,及如何自定义异常。
Error和Exception
其中的一些子类最好是重点理解:比如NoClassDefFoundError和ClassNotFoundException有什么区别。
2.理解Java语言中操作Throwable的元素和实践。掌握基本的语法try-catch-finally块,throw和throws关键字等。与此同时也要懂得如何处理典型场景。
异常处理比较繁琐,比如我们需要写很多千篇一律的捕获代码,或者在finally里面做一些资源回收工作。随着Java语言的发展,引入一些更加便利的特性,比如try-with-resources和multiple catch

try (BufferedReader br = new BufferedReader(…);
     BufferedWriter writer = new BufferedWriter(…)) {// Try-with-resources
// do something
catch ( IOException | XEception e) {// Multiple catch
   // Handle it
} 

知识扩展

案例1:

try {
  // 业务代码
  // …
  Thread.sleep(1000L);
} catch (Exception e) {
  // Ignore it
}

原则1:尽量不要捕获类似Exception这样的通用异常,而是应该捕获特定异常,在这里Thread.sleep()抛出的是InterruptedException。这是因为,在日常生活中读代码的机会远超于写代码。另外也可能捕获到我们不想捕获的异常。
进一步讲,除非深思熟虑了,否则不要捕获 Throwable 或者 Error,这样很难保证我们能够正确程序处理 OutOfMemoryError。
原则2:不要生吞(swallow)异常 。这是异常处理中要特别注意的事情,因为很可能会导致非常难以诊断的诡异情况。就是要抛出异常。

我们从性能角度来审视一下 Java 的异常处理机制,这里有两个可能会相对昂贵的地方:
try-catch 代码段会产生额外的性能开销,或者换个角度说,它往往会影响 JVM 对代码进行优化,所以建议仅捕获有必要的代码段,尽量不要一个大的 try 包住整段的代码;与此同时,利用异常控制代码流程,也不是一个好主意,远比我们通常意义上的条件语句(if/else、switch)要低效。
Java 每实例化一个 Exception,都会对当时的栈进行快照,这是一个相对比较重的操作。如果发生的非常频繁,这个开销可就不能被忽略了。

复盘 念念不忘 必有回响

世界上存在永远不会出错的程序吗?

首先,我们就要想想什么是程序了?
我自己一般这样去定义程序,在某种场合,按照特定步骤操作,可实现某种功能的,虚拟意识逻辑。
我把所有的程序都归结于意识逻辑,因为我们不仅有程序还有走程序这样的概念。
那么一个程序出错可能出现的地方是哪些呢?
1.某种场合 如果放在我们的编程中去讲的话就是指运行环境
2.按照特定步骤走的情况下走时遇到没有意料到的情况
3.某种功能未能实现(设计上的问题)
那么存在不会出错的程序吗?
就很多抽象的事情上,本来没有什么绝对的正确错误之分,只是人总是将某种自己的意识归为正确或是错误。
具体的事情上,正确与错误的判定在于结果。
不会出错的程序,那就看你如何去看了,是抽象还是具体。

Exception和Error

Exception异常,Error错误。两者都继承了Throwable类。在Java中只有Throwable类的实例才能被抛出(throw)或者捕获(catch),Throwable它是异常处理的机制的基本组成类型。
Exception是正常运行中可以预料的意外情况,可以被捕获并且处理。
Error是正常运行中不太可能预料到的情况,属于非正常情况。Error不便于捕获也不需要捕获。
Exception 可检查Checkded异常,和不可检查异常Unchecked。
可检查异常在源代码里必须显示的进行捕获处理,这是编译期检查的一部分。
不检查异常就是所谓的运行时异常,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。
ps:现阶段我经常遇到的异常是运行时异常,主要是自己写代码的时候出现的问题。

如何处理好异常

1.理解异常Throwable,Exception,Error,可检查异常和不可检查异常,及与此有关的一些常用子类异常。
2.基本的异常操作,try-catch-finally 关键字 throw throws及自定义异常。如何处理典型场景。
原则:
1.尽量不要直接捕获Exception这样大的异常,而是捕获特定的异常。
2.不要把异常直接吃掉,就是说本来存在的异常,假设不存在,不抛出异常,不打印日志。
3.e.printStackTrace();尽量不要用于生产,因为不知道他会输出到哪里。
4.throw early,catch late原则
5.自定义异常中是否需要定义Checked异常,这种类型异常的初衷是从异常情况恢复,作为异常设计者,我们往往有充足信息进行分类。
6.保证诊断信息足够的时候,也要去掉敏感信息,密码账户等。用户数据一般不输入日志里。
7.try catch代码段会产生额外的性能开销,尽量捕获有必要的代码段。
8.Java每实例化一个Exception,都会对当时的栈进行快照。如果发生的非常频繁,性能消耗比较严重。

反应式编程(Reactive Stream) -------没听过


1.NoClassDefFoundError和ClassNotFoundException有什么区别。
2.啥是反应式编程

本文链接:

https://heyzen.club/index.php/J/32.html
1 + 1 =
快来做第一个评论的人吧~