异常
- 异常(exception)又称为例外、差错、违例
- 对应着Java运行错误处理机制
基本写法
try {
语句组
} catch (Exception e) {
异常处理语句组
}
下面我们来看一个例子
try {
int n = 1 / 0;
} catch (ArithmeticException ex) {
System.out.println("捕获了一个 ArithmeticException 异常!");
ex.printStackTrace();
} catch (Exception ex) {
System.out.println("捕获了一个 Exception 异常!");
ex.printStackTrace();
} finally {
System.out.println("打印 finally 语句。");
}
Java中处理异常
- 抛出(throw)异常
- 运行时系统在调用栈中查找
- 从生成异常的方法开始进行回溯,直到找到;
- 捕获(catch)异常的代码
相关的语句
抛出异常
- throw 异常对象;
捕获异常
try{
语句组
}catch(异常类名异常 形式参数名){
异常处理语句组;
}catch(异常类名异常 形式参数名){
异常处理语句组;
}finally{
异常处理语句组;
}
其中,可以有0到多个 catch,可以没有 finally。
异常的分类
- Throwable(异常顶级父类)
- Error:JVM的错误(我们应用程序一般不去管)
- Exception:异常
多异常的处理
- 子类异常要排在父类异常的前面
finally语句
- 无论是否有异常都要执行
- 即使其中有 break,return 等语句
int a = 100;
System.out.println(a);
try {
a = 200;
System.out.println(a);
} catch (IndexOutOfBoundsException ex) {
a = 300;
System.out.println(a);
} catch (Exception ex) {
a = 400;
System.out.println(a);
} finally {
a = 500;
System.out.println(a);
}
a = 600;
System.out.println(a);
Exception分两种
- RuntimeException及其子类,可以不明确处理
- 否则,称为受检的异常(checked Exception)
- 受检的异常,要求明确进行语法处理
- 要么捕获(catch)
- 要么抛出(throws):在方法的签名后面用 throws xxxx 来声明,而调用方法的类也同样如此要么捕获要么抛出。
- 在子类中,如果要覆盖父类的一个方法,若父类的方法声明了 throws 异常,则子类的方法也可以 throws 异常
- 可以抛出子类异常(更具体的异常),但不能抛出更一般的异常
面试题
Error和Exception的区别?
Error:JVM 无法解决的严重问题,如栈溢出StackOverflowError、内存溢出OOM等。程序无法处理的错误。
Exception:其它因编程错误或偶然的外在因素导致的一般性问题。可以在代码中进行处理。如:空指针异常、数组下标越界等。
运行时异常和非运行时异常(checked)的区别?
unchecked exception包括RuntimeException和Error类,其他所有异常称为检查(checked)异常。
- RuntimeException由程序错误导致,应该修正程序避免这类异常发生。
- checked Exception由具体的环境(读取的文件不存在或文件为空或sql异常)导致的异常。必须进行处理,不然编译不通过,可以catch或者throws。
throw和throws的区别?
- throw:用于抛出一个具体的异常对象。
- throws:用在方法签名中,用于声明该方法可能抛出的异常。子类方法抛出的异常范围更加小,或者根本不抛异常。
在写项目时,也推荐将异常都统一的抛在某个类里面,方便统一一起管理。