什么是异常
在java程序运行时可能出现的一些错误称为异常。异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令过程。
例:创建一个Demo类,在主方法中定义int型变量,将0作为除数赋值给该变量。
public class Demo{ public static void main(String[] args) { int result=3/0; System.out.println(result); } } |
运行结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero at Demo.main(Demo.java:3) |
上面的程序运行结果报告发生了算术异常ArithmeticException,系统不再执行,提前结束。当在某一方法中发生异常错误的时候,这个方法创建一个对象,并且把它传递给运行时系统。这个对象就是异常对象。
捕获异常
Java语言可以捕获程序中可能出现的异常,主要由try...catch语句完成。Java异常处理的结构如下:
try { //程序块 }catch(Exception e) { //对Exception异常的处理 }finally { //程序块 } |
其中,try语句块存放的是可能发生异常的java语句。Catch程序块在try语句块之后,用来处理被捕获的异常。另外,finally语句块是异常处理结构的最后执行部分。不管try块中代码如何退出,都将执行finally块。(finally是可选部分)。
例:异常处理实例
public class Demo{ public static void main(String[] args) { int result=10; try { System.out.println("程序开始"); result=result/0; System.out.println("result="+result); }catch(Exception e) { e.printStackTrace(); }finally { System.out.println("程序结束"); } } } |
运行结果:
程序开始 程序结束 java.lang.ArithmeticException: / by zero |
从运行结果可以看出,程序仍然输出最后的“程序结束”信息,没有因为异常而终止。Catch关键字后面括号中的参数类型Exception就是try代码块传递给catch代码块的异常类型。Catch代码块中的语句“e.printStackTrace();”用于输出异常的堆栈跟踪信息。在以下3种特殊情况下,finally语句不会被执行。
1. 在finally语句块中发生了异常。
2. 在前面代码中用了“System.exit()”语句退出程序。
3. 程序所在的线程死亡。
声明可能会出现的异常
若某个方法发生异常,但不想在当前方法中处理这个异常,那么可以使用throws关键字将异常向上抛出,由调用者处理异常。
public static int fun(int x,int y) throws Exception{ int result=0; result=x/y; return result; } |
如果调用fun()方法可能会出现异常,那么该异常由主方法来处理。
public static void main(String[] args) { int x=10; int y=0; try { fun(x,y); }catch(Exception e) { e.printStackTrace(); } } |
抛出异常
Throw语句用于抛出异常,值得注意的是,由throw语句抛出的对象必须是java.lang.Throwable类或者其子类的实例。
public class Demo{ static int fun(int x,int y)throws Exception{ if(y<0) { throw new Exception("除数不能为0"); } return x/y; } public static void main(String[] args) { int result=0; try { result=fun(10,0); } catch (Exception e) { e.printStackTrace(); System.out.println("除数不能为0"); } } } |
运行结果:
java.lang.ArithmeticException: / by zero at Demo.fun(Demo.java:6) at Demo.main(Demo.java:11) 除数不能为0 |
运行时异常
RuntimeException异常中程序运行过程中产生的异常。所有的异常类都是Throwable类的子类。Throwable类派生了两个子类,分别是Exception和Error类。Error类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类错误比较严重。Exception类称为非致命性类,可以通过捕捉处理使程序继续执行。
RuntimeException异常的种类
种类 | 说明 |
NullPointerException | 空指针异常类 |
ArrayIndexOutOfBoundsException | 数组下标越界异常 |
ArithmeticException | 算术异常类 |
ArrayStoreException | 数组中包含不兼容的值 |
IllegalArgumentException | 非法参数异常 |
SecurityException | 安全性异常 |
NegativeArraySizeException | 数组长度为负 |
异常的使用原则
异常处理可遵循以下几条原则:
1. 在当前方法声明中使用try...catch语句捕获异常。
2. 一个方法被重写时,重写它的方法必须抛出相同的异常或异常的子类。
3. 如果父类方法抛出多个异常,那么子类重写该方法必须抛出那么异常的一个子集,不能抛出新异常。