异常(Execption)
体系结构
Throwable
[可以向外抛出,泛指所有问题]
Error[错误] Execption[异常]
RuntimeExecption[运行时异常]
*1、Error和Excetion有什么区别?*
Error是指底层硬件环境或者系统原因导致的相对严重的问题,程序员无法通过编码解决的问题,相对严重。
Exception是指程序在运行过程中出现的例外情况,无法正常执行接下来的逻辑。相对较轻。
*2、运行时异常和非运行时异常的区别?*
运行时异常在编译的时候不要求程序员给出处理方案,编译直接能够通过,异常会在运行时直接体现出来,继承自RuntimeException
非运行时异常在编译的时候就要求程序员先给出处理方案
否则编译通过,继承自Exception类
列举一下运行时异常
-
运算符:
-
ArithmeticException 算术异常
-
数组
-
NegativeArraySizeException 负数数组大小异常
-
ArrayIndexOutOfBoundsException 数组索引值超过边界异常
-
字符串
-
StringIndexOutOfBoundsException 字符串索引值超出边界异常
-
NumberFormatException 数字格式异常
-
集合
-
IllegalArgumentException非法参数异常
-
IllegalStateException 非法状态异常
-
IndexOutOfBoundException 索引值超出边界异常(集合)
-
ConcurrentModificationException 并发修改异常
-
最常见的异常
-
NullPointerException 空指针异常
-
ClassCastException 类型造型异常
为什么处理异常?
非运行时异常,不处理,编译无法通过。
出现异常,之后语句不再执行了
如何处理异常?
抛还上级 throws
自行处理 try{ } catch{ }
如何自定义异常?
写一个类 然后继承 Exception 或者 RuntimeException
非运行时异常 运行时异常
通过构造方法首行的super("…");给异常传递它的描述信息 -
1: 当类体当中某个静态变量是通过调用有异常声明的方法完成赋值的时候 我们不能在类体最后加throws
更不能在类体当中写try catch 那岂不是没法处理异常了? 此时必须借助静态初始化块 在初始化块块当中可以进行异常处理 -
2: 方法覆盖的时候 父类当中的方法如果没有异常声明 子类在覆盖这个方法的时候 其实可以抛出各种运行时异常
但是这个行为没有意义 因为Java当中的每个方法默认就抛出所有运行时异常 也就是说 每个方法都有看不见的 throws
RuntimeException -
3: 当程序当中连续多个资源需要连续多行关闭的时候 我们希望无论前者关闭是否成功 都要去尝试关闭后面的资源 此时必须使用try
catch finally 的finally当中嵌套try catch 我们把这种语法称作 连环try -
4: 我们不应该在try的大括号当中定义变量 这样大括号执行结束变量就消亡了 下文程序当中就不能使用这个变量
如果在下文程序当中还想要使用这个变量 那么需要把ta的定义拿到try前面去 并且以默认值赋值 try当中只做重新赋值的操作,而不要做定义的操作。