首先得明确一点,异常与错误是有本质区别的:
错误:断电、宕机、山崩、海啸或者硬件等问题所导致程序不能运行
异常:1.它是可以处理的,处理之后程序可以继续运行
2.异常是对象
3.如果自己不处理异常,会抛给调用者,如果调用者也不处理异常,最终会抛给JVM,程序会停止运行
异常又分为:编译异常和运行时异常
编译异常:调用了抛出异常的方法,不处理,编译就会失败
运行异常:抛出的异常是RuntimeException,或是它子类对象
Jdk API文档描述:
Throwable
类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw
语句抛出。类似地,只有此类或其子类之一才可以是 catch
子句中的参数类型。
Exception
类及其子类是 Throwable
的一种形式,它指出了合理的应用程序想要捕获的条件。
RuntimeException
是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。
第一个异常程序:
package com.xiao.exception;
/**
* @author 笑笑
* @Date 2018年3月21日下午10:29:00
*
*/
public class ExceptionDemo {
//第一个异常测试,索引越界异常
public static void test1(){
int[] arr = {1,2,3};
System.out.println(arr[3]);
}
}
由于数组只有三个元素,索引从0开始,最大索引为2,我打印arr[3],数组没有此索引,这样就会抛出java.lang.ArrayIndexOutOfBoundsException(索引越界异常)。
主动抛出异常:
关键字:throw +创建异常对象 在方法内部抛出异常的对象,必须是Exception类或其子类
throws + 类名 在方法上声明异常,这样调用者才能知道被调用者内部可能有异常发生
注:如果方法内部抛出的是运行异常,方法声明不需要throws语句
//throw/throws 关键字测试
public static void test2() throws Exception{
throw new Exception("我是throw");
}
异常处理:
方式一:在方法声明上,使用throws关键字把异常向上抛出
方式二:try...catch...finally 语句处理异常
public static void test3() {
try{
//可能出现异常的代码
}catch(异常类型 变量){
//处理异常的代码
}finally{
//必须执行的代码
}
}
finally有一种情况不会执行:
在try或catch中加上代码:System.exit(0); 这句代码表示停止虚拟机,这样finally中的代码就不会执行了
finally代码块一般用于释放资源
继承关系中的异常:
父类的方法,如果抛出异常,子类重写该方法,可以抛出异常,也可以不抛出异常;但是,如果子类要抛出异常,抛出的异常不能大于父类抛出的异常。(必须是父类抛出的异常或其子类)
父类的方法没有抛出异常,子类重写后,不能抛出异常;如果有异常,只能使用try...catch...语句处理异常
自定义异常:
继承Throwable类,或者继承他的子类;
即:继承其子类:Exception类或者RuntimeException类
在构造方法中,使用super();把异常信息传给父类。