Java进阶练习题整理(1)
1. 检查时异常、非检查时异常、运行时异常。
Throwable是一切异常、错误类的超类,Throwable有两个子类,Error(错误)和Exception(异常)。
Exception异常又分为RuntimeException运行时异常(非检查时异常)、检查时异常和非检查时异常。
运行时异常是在开发中测试功能时程序终止,控制台出现的异常。
运行时异常有:空指针异常、下标越界异常、类转换异常、数据存储异常、缓存缓存异常、非法参数异常、算术运算异常、数组存储异常、大小为负数的数组错误异常、数字格式异常、不支持的操作异常、安全异常。
InputMismatchException:Scanner输入不符合类型的运行时异常。
ClassCastException:强制转换时不通过的运行时异常
运行时异常表示虚拟机的通常操作中可能遇到的异常。
检查时异常是RuntimeException以外的异常,从程序语法角度讲师必须进行处理的异常,如果不处理,程序就不能编译通过。检查时异常就是写代码时出现红线,需要try-catch 或者throws时出现的异常。
检查时异常有IO异常、SQL异常。
非检查时异常:
ClassNotFoundException:是非检查时异常。反射时出现的类型找不到异常。当动态加载Class的时候找不到类会抛出该异常 。一般在执行Class.forName()、ClassLoader.loadClass()或ClassLoader.findSystemClass()的时候抛出
序列化的含义:
讲一个对象的状态(各个属性量)保存起来,然后再适当的时候再获得。
所以static和transient修饰的变量不能被序列化。原因是static修饰的是变量描述类的状态,transient修饰变量不能被持久化(序列化),代表临时数据。
序列化的过程:
部分一:序列化:将数据分为字节流,以便存储在文件或网络上传输。
部分二:反序列化:打开字节流,并重构对象。
序列化的限制:
(1)只能对对象的状态进行保存,而不管对象的方法。
(2)当父类实现序列化,子类自动实现序列化,不需要显示实现Serializable接口。
这就解释了为什么Exception的定义中,没有实现Serialize接口,但是有序列化ID的原因。因为父类Throwable实现了Serialize接口。
public class Exception extends Throwable { static final long serialVersionUID = -3387516993124229948L;...} public class Throwable implements Serializable { /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -3042686055658047285L;}