异常
所谓的异常就是程序在编译过程中或者运行过程中出现的问题!!
根类:Throwable
子类: Exception(异常类) 一般是程序编写不当造成的
子类: Error(错误类) 一般是由系统引起/硬件问题
- 运行时异常:都是
RuntimeException
类及其子类异常,如NullPointerException
(空指针异常)、IndexOutOfBoundsException
(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch
语句捕获它,也没有用throws
子句声明抛出它,也会编译通过。 - 非运行时异常 (编译异常):是
RuntimeException
以外的异常,类型上都属于Exception
类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException
、SQLException
等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
public void printStackTrace();打印当前异常对象的详细信息(异常的类型,异常的原因,异常的位置)[只用这个] public String getMessage(); 获取异常的部分信息(异常的原因) public String toString(); 获取异常的类型和异常描述信息
在编译时期报错了,提示可能有异常!
Exception以及其子类(RuntimeException除外)都属于编译时异常
比如: SimpleDateFormat的parse方法
运行时异常
在编译时期不报错,运行时期才出现异常!
RuntimeException以及其子类都属于运行时异常
比如: 空指针异常,数组越界异常,类型转换异常
a.运行时异常被抛出可以不处理。即不捕获也不声明抛出。[非常重要!!] b.如果父类的方法声明抛出了多个异常,子类覆盖(重写)父类方法时,只能声明抛出相同的异常或者是他的子集。 c.如果父类的方法没有声明抛出异常,子类覆盖(重写)父类方法时,也不能声明抛出异常(多线程中就会用到) d.多个异常我们如何捕获处理??[非常重要!!] 代码1; //声明抛出OneException 代码2; //声明抛出TwoException 代码3; //声明抛出ThreeException i.分开捕获分开处理 try{ 代码1; //声明抛出OneException }catch(OneException e){ e.printStackTrace(); } try{ 代码2; //声明抛出TwoException }catch(TwoException e){ e.printStackTrace(); } try{ 代码3; //声明抛出ThreeException }catch(ThreeException e){ e.printStackTrace(); } ii.一起捕获,分开处理 try{ 代码1; //声明抛出OneException extends TwoException 代码2; //声明抛出TwoException 代码3; //声明抛出ThreeException }catch(OneException e){ e.printStackTrace(); }catch(TwoException e){ e.printStackTrace(); }catch(ThreeException e){ e.printStackTrace(); } iii.一起获取一起处理[最常用的!!] try{ 代码1; //声明抛出OneException 代码2; //声明抛出TwoException 代码3; //声明抛出ThreeException }catch(Exception e){ e.printStackTrace(); } e.当选择ii中处理多个异常时,如果这些异常有子父类关系,那么必须先处理子类异常,再父类异常 f.在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收(IO流的关系,网络连接关闭)