1、什么是异常
- 不是语法错误
- 不是逻辑错误
- 而是在程序运行中,一些不可控的因素,不期而至的各种状况,导致程序运行异常。
- 例如:文件不存在,网络中断,非法输入等
2、异常的处理机制的原理,过程
- Java程序在某句代码处发生了异常,JVM会new合适的异常对象,并把异常的信息封装到对象中,然后抛出,如果该代码没有环绕try…catch块,那么会先向上(调用者)抛出,如果上级也没有处理,那么一直往上抛,最终可能到达JVM,导致程序中断。如果其中有一个部分将这个异常对象“捕获”,程序继续进行,不会中断。
3、异常的体系结构
1、java.lang.Throwable
- Java 语言中所有错误或异常的超类。
- (1)只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。
- (2)只有此类或其子类之一才可以是 catch 子句中的参数类型。
2、java.lang.Error
- 用于指示合理的应用程序不应该试图捕获的严重问题。
- 例如:VirtualMachineError虚拟机错误
- StackOverflowError栈溢出
- OutOfMemoryError内存溢出
3、java.lang.Exception
-
受检异常
-
在编译阶段必须编写“异常处理”的代码,否则编译不通过
-
ParseException
-
IOException FileNotFoundException
-
SQLException
-
运行时异常
-
RuntimeException
-
在编译阶段不要求强制编写“异常处理”的代码,但是希望程序员,尽量避免
ClassCastException
NullPointerException
ArrayIndexOutOfBoundsException
4、异常的处理机制
1、抛
(1)JVM自动抛
(2)throw 异常对象; (1)JDK中定义异常类型;(2)自定义异常类型
2、抓
5、异常处理
1、捕获处理
(2)catch可以多个,但是执行时,如果发生异常,只会进入其中一个
(3)多个catch()中的类型不能相同。如果是“互斥”关系,某个异常不是继承关系,顺序随意。
如果“包含”‘关系,异常之间有继承关系,子上父下。
(4)finally
无论是否发生异常都会运行的代码,一般编写释放资源的代码。
尽量避免在finally写return语句
2、上报处理
throws,语法格式:【修饰符】 返回值类型 方法名(形参列表)throws 异常列表。
把异常抛给调用者处理。
6、throw
用于手动抛出异常对象
可以抛出系统已定义异常,也可以抛出用户自定义异常
throw可以代替return语句结束方法,但是没有返回值
7、重写与异常列表
重写方法的要求:
两同:方法名与形参列表
两小:
返回值类型,基本数据类型与void:必须相同。引用数据类型: 子类的方法的返回值类型可以是父类被重写方法的返回值类型的子类。
异常类型,子类抛出的异常类型 要么和父类被重写方法抛出的异常一样,要么是父类被重写方法抛出的异常的子类。
一大 :权限修饰符。子类方法的权限修饰符 》= 父类被重写方法的权限修饰符。
public > protected>缺省>private
8、finally与return都存在
没有异常:try–>【返回值赋值】–>finally–>结束方法。
有异常:try–>catch–>【返回值赋值】–>finally–>结束方法。
9、自定义异常
是一个类,必须继承Throwable或它的子类
必须通过throw才能抛出
public class MyException extends Exception{
/**
* 序列版本号唯一的标识当前类
*/
private static final long serialVersionUID = 6650357798030558092L;
public MyException(){}
public MyException(String msg){
super(msg);
}
}