关键字
try: 抛出异常
catch: 捕获异常
finally: 无论如何都会执行的代码,如果代码中有System.exit(int status);则程序终止不会执行,status为0则表示程序正常终止,非0表示程序异常终止;
如果finally中有终端方法的return语句,则最终都会return finally中的值
必须组合使用,try可以跟多个catch,也可以不跟catch,跟一个finally。
常见的运行时异常: java.lang包下
ArithmeticException: 数学运算异常
NumberFormatException: 数字格式化异常
ArrayIndexOutOfBoundsException: 数组下标越界异常
NullPointerException: 空指针异常
ClassCastException: 类型转换异常
ArrayStoreException: 数组中包含不兼容的值的异常
java.util. InputMismatchException: 输入格式错误的异常
FileNotFoundException: 文件未找到异常
throw&throws:
throws:
- 当一个方法没有能力处理异常或者不想处理异常,则可以在方法后跟一个throws将异常抛出,由调用该方法的方法处理异常。可以抛出多个, 当抛是非检查异常时,编译器不会强制要求调用方法进行异常处理
- 当一个类重写父类方法抛出了一个异常,子类中重写方法中所抛出的异常必须时父类抛出的同类(兄弟类)或其子类
/**
*父类
*/
public class Father {
public void test() throws HotelException{
throw new HotelException();
}
}
/**
* 子类
*/
public class Son extends Father {
@Override
public void test() throws RuntimeException {
}
}
throw:
语法:throw new 异常类型(String message)
throw和return都会终止操作故不能同时出现
throw抛出异常后的处理方案:
- 自己try…catch…
- 在方法声明处throws抛出(可以跑出异常类型相同类型或者父类)
自定义异常
- 继承exception或其子类,在构造方法中调用父类的构造并传参。
- 自定义异常必须经过抛出后才能进行捕获、处理
public class HotelException extends Exception {
public HotelException(){
super("酒店不允许小于18岁大于80岁的人员单独入住");
}
}
异常链
多个方法依次抛出异常,可以用异常链将异常都保存下来,一次性处理
public class TryDemo {
public static void main(String[] args) {
TryDemo t = new TryDemo();
try {
t.testThree();
} catch (Exception e) {
e.printStackTrace();
}
}
public void testOne() throws HotelException{
throw new HotelException();
}
public void testTwo() throws Exception {
try {
testOne();
}catch (Exception e){
//避免异常丢失的第一种方法:在throw新异常时,在参数中加上之前的异常
throw new Exception("我是two中的异常",e);
}
}
public void testThree() throws Exception {
try {
testTwo();
} catch (Exception e) {
//避免异常丢失的第二种方法,新生命一个异常,调用initCause将之前的异常封到新异常
Exception e1 = new Exception("我是three中的异常");
e1.initCause(e);
throw(e1);
}
}
}