Java异常机制
什么是异常
在软件运行过程中,我们可能会遇到一些这样的问题:比如程序要打开一个文件,而文件的格式不对或文件不存在;要读取数据库的数据时,数据是空的…
以上遇到的问题,称之为异常(Exception)。
异常是指在程序运行中遇到了各种无法预料的状况:文件找不到,非法参数等。它会影响正常程序执行的进程。
简单分类
- 检查性异常:用户的错误或问题引起的异常,在编译时不能忽略。
- 运行时异常:可以被程序员避免的异常,在编译时被忽略。
- 错误:错误并不是异常,错误脱离了用户掌控,在编译时也检查不到。例如:栈的溢出
异常体系结构
在Java中,把异常当作对象来处理。并定义了一个基类(Throwable)作为所有异常的父类。在Java API中已经定义了许多异常类,这些异常类分为两大类:错误(Error)和异常(Exception)。
错误(Error):由Java虚拟机生成并抛出,大多数错误与代码编写执行无关。
异常(Exception):在该类的子类中有一个重要的子类RuntimeExceptions(运行时异常)该类下的异常时不检查异常,在编译时可以选择捕获也可以不处理。该类异常一般是由程序逻辑错误引起的。
错误与异常:
Error通常是灾难性的致命错误,是程序中无法处理和控制的。当该错误发生时,JVM一般会选择终止线程。Exception通常情况下是可以被程序处理的,并且在程序中应尽可能去捕获处理异常。
异常处理机制
关于异常的关键字:
catch try finally throws throw
示例:
public static void main(String[] args) {
int a=10,b=0;
try{//try监控区
System.out.println(a/b);
} catch (ArithmeticException e) {//捕获异常 catch(想要捕获的异常类型)
System.out.println("变量b的值不能为0");
} catch (java.lang.Exception t){
System.out.println("Exception");
}catch (Throwable e) {
System.out.println("Throwable");
}
//捕获多个异常:异常类型从小到大,有优先级
finally {//善后工作 关闭IO等,可以不设置。
System.out.println("finally");
}
}
运行结果:
抛出异常 throw throws
throw:抛出一个异常 格式:throw 异常
throws:声明异常 将该方法可能抛出的异常声明的异常标注在方法定义的位置从而提醒使用者注意到该异常
public class ArrayIndex {
public static void f(){
int [] a=new int[10];
a[10]=10;
}
public static void g(){
try{
f();
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("yes");
throw e;
}
}
public static void h(){
int i=1;
if(i<10){
g();
}
}
public static void l(){
h();
}
public static int devide(int x,int y)throws ArithmeticException
{
if(y==0){
throw new ArithmeticException("y==0");
}
return x/y;
}
public static void main(String[] args) {
try{
devide(10,0);
}
catch(ArithmeticException e){
System.out.println("捕获了算数异常");
e.printStackTrace();//打印异常
}
finally {
System.out.println("jieshu");
}
l();
}
}
运行结果:
关于异常,可以用throw抛出异常即将该异常的捕获处理交给该语句所在块的上一层,由上一层处理若上一层依然无发处理则继续抛出。如上例中方法g()抛出了异常,方法h()调用了g(),那么h()就是g()的上一层。以此类推,可以看到main()方法是最上一层它的下一层是l()。
捕获到异常后可以调用printStackTrace()方法打印出异常包括异常的位置内容。如果,抛出异常后不捕获处理,则会自动打印该异常。如上例的f()~main()抛出后不捕获,devide()-main()调用printStackTrace()方法。
自定义异常
Java为用户提供了非常多的异常类,用户也可以根据自己需求去自定义异常。
public class MyException extends Exception{
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
public static void test(int x)throws MyException{
if(x==1)
throw new MyException("抛出自定义异常");
}
public static void main(String[] args) {
try{
test(1);
}catch( MyException e){
e.printStackTrace();
System.out.println("捕获了自定义异常");
}
catch (ArithmeticException e){
System.out.println("--");
}
}
}
用户自定义的异常类必须继承Exception类。然后在该类中根据需求编写,其使用遵从异常处理机制。
自定义异常步骤:
- 创建自定义异常类
- 在方法中通过关键字throw抛出异常
- 如果在当前抛出异常的方法中捕获处理异常,使用try-catch。否则在方法声明处使用throws指明方法调用者的异常
- 在出现方法调用者中捕获并处理异常