程序本身可以处理的异常,可以通过 catch 来捕获,Exception 又分为编译时异常和运行时异常
属于程序无法处理的错误,不建议通过 catch 捕获【Java虚拟机运行错误 VirtualMachineError】【虚拟机内存不够错误 OutOfMemoryError】等。这些异常发生的时候,JVM 会选择线程终止
【两者都有一个共同的祖先 java.long 包中的 Throwable】
NullPointException(空指针)、NumberFormatException(字符串转换数字格式错误)、ArrayIndexOutOfBoundsException(数组下标越界)、ArithmeticException(算术错误)、ClassCaseException(类型转换错误)
当在 try 和 finally 中同时存在 return 的时候,try 中的 return 会被忽略,是因为 try 语句中的 return 返回值会被暂存在一个本地变量中,当执行完 finally 中的 return 后,本地变量也就变成了 finally 中的 return 值
不一定,比如在 finally 之前虚拟机被终止运行、程序所在的线程死亡、关闭 CPU
不吧异常定义为静态变量,会导致异常栈信息错乱、抛出的信息存在一定的意义、抛出的异常更加具体一些【比如数字转换错误的时候应该是 NumberFormatException 而不是 IllegalArgumentException】
使用泛型参数,可以增强代码的可读性和稳定性。可以用来泛指一类,比如在List集合中只存入Person类型的对象。List 返回值类型为 Object,需要手动转换类型才能使用,使用泛型后编译器自动转换
泛型类、泛型接口、泛型方法
public class Generic<T>{
}
public interface Generator<T>{
}
public static <E> void printArray(E[] inputArray){
}
静态泛型方法:泛型必须在传递类型后才能使用,类在实例化时才能传递参数类型,但静态方法的加载是在类的实例化之前的,也就是说类中的泛型还没有传递参数类型,静态反省方法就已经完成了,所以泛型方法是没法使用类上声明的泛型的,只能使用自己声明的泛型标识[
自定义接口通用返回结果,通过泛型参数根据具体的返回类型动态的指定结果的数据类型、集合工具类等
通过反射可以获取任意一个类的所有属性和方法,还可以调用这些属性和方法
反射可以让我们的代码更加灵活
可以无视泛型参数,反射的性能也较为差一些,但对于框架来说实际影响并不大
各大框架:SSM、SpringBoot等。注解的实现也是用到了反射
注解可以看作是一种特殊的注释,主要用于修饰类、方法、变量,提供一些信息让程序在编译或者运行时候来使用【注解本质是继承了 Annation 一个特殊接口】
服务提供者的接口,就是专门提供给服务提供者或者扩展框架功能的开发者去使用的一个接口
SPI 将服务接口和具体的服务实现分开,将服务调用方和服务实现房进行解耦,能够提升程序的扩展性、可维护性【Spring框架、数据库加载驱动、日志接口等】
使用 transient 关键字来修饰,作用就是被 transcient 修饰的变量值不会被持久化和恢复【transient 只能修饰变量,不能修饰类和方法,transient 修饰的变量,在反序列化后变量值会是类型的默认值。static 修饰的不属于任何对象,所以无论有没有被 transient 修饰,都不会被序列化】
IO就是 Input/Output,输入和输出。数据输入到计算机内存这个过程为输入,输出到外部(数据库,文件等)这个过程为输出
IO 流在 Java 中分为输入流和输出流,根据数据的处理方式又分为字节流和字符流【关于 IO 流的类都是基于 InputStream、OutputStream、Reader、Writer 这四个类】
字符流是 Java 虚拟机将字节转换得到的,过程是比较耗时的。而且如果不知道编码类型的情况下,使用字节流的过程容易出现乱码
装饰器模式:可以在不改变原有对象的基础上拓展它的功能【对于字节流来说,FilterInputStream(对应输入流) 和 FilterOutputStream(对应输出流) 是装饰器模式的核心,分别用于增强 InputStream 和 OutputStream 子类对象的功能(字节缓冲输入流和字节缓冲输出流都是 FilterInputStream 和 FilterOutputStream 的子类)】
为什么不直接搞一个字符缓冲文件输入流?因为 InputStream 的子类太多,继承关系也复杂,如果给每一个子类都指定一个对应的缓冲流,太过麻烦
适配器模式:主要用于接口互不兼容类的协调工作【代码中,InputStreamReader 和 OutputStreamWriter 就是两个适配器来实现字节流到字符流的转换。现实举例来说就是,充电宝,它可以吧电充给手机,也可以被充电器来蓄电】
为了方便程序员开发设计出来的一种特殊语法,这种语法对功能并没有影响,可以实现相同的功能,但基于语法糖的代码往往更加简单、可读性更强【比如 for-each,原理就是基于普通的 for 循环和迭代器】
泛型、自动拆箱装箱、变长参数、枚举、内部类、for-each、try-with-resource、lambda 表达式等