什么是异常
在程序运行过程中,可能会发生各种非正常状况,如磁盘空间内存不足网络连接中断,被加载的类不存在等等。针对这种情况,java语言中就引入了异常,以异常类的形式对这些非正常状况进行封装,进而通过异常处理机制对这些非正常状况问题进行处理。图1 java异常类层次图
我们直接就上例图分析java异常处理机制,从图一可以看出,所有的异常都是继承Throwable ,也就是说 Throwable 是所有异常的父类。然后往下走就会发现Throwable有两个直接子类,一个Error类(错误),一个Exception类(异常)。我们接下来就这两个类来分析java的异常处理机制
java Error
java错误类,表示java运行时产生的 系统内部错误 或 资源耗尽 的错误,是比较严重的,靠修改程序本身是不能修复执行的。java Exception
java异常类,表示程序本身可以处理的错误,在java开发中进行的异常处理,都是针对Exception类及其子类。在Exception子类中有个RuntimeException类,该类及其子类表示运行时异常,其他的表示编译时异常。
在java中java异常处理机制主要依靠 try catch finally throw throws 五个关键字。举个栗子:
- try-catch语句
//一个除法方法
public class Example {
public static void main(String[] args) {
System.out.println(Div(3,1));
}
public static int Div(int i , int j)
{
int result = 0 ;
result = i/j;
return result;
}
}
结果显示为3,看似没什么错,但当j = 0 时,就会报错;
Exception in thread “main” java.lang.ArithmeticException: / by zero
at test.Student.Div(Student.java:11)
at test.Student.main(Student.java:6)
这时用try - catch 语句块来捕获异常,就不会报错了。
public class Example {
public static void main(String[] args) {
System.out.println(Div(3,0));
}
public static int Div(int i , int j)
{
int result=0;
try {
result= i/j;
} catch (Exception e) {
}
return result;
}
}
点击运行,结果显示0,运行成功,无错误提示。在try代码块中发生除0异常,程序转而执行catch中的代码,catch代码块对异常处理完毕后,程序仍会往下执行,而不会异常终止。
-try-catch-finally语句
在try代码块中,发生异常的语句后面的代码不会被执行。有时需要执行些语句在发生异常的情况下。这时在try-catch代码块后加一个finally代码块。
public class Example {
public static void main(String[] args) {
System.out.println(Div(3,0));
}
public static int Div(int i , int j)
{
int result=0;
try {
result= i/j;
System.out.println("try语句执行了");
} catch (Exception e) {
e.printStackTrace();
}finally{
System.out.println("finally语句执行了");
}
return result;
}
}
上述代码中在try代码块中如有异常语句,则输出语句不会被打印,而finally中的输出语句一定会被打印,不管try语句是否有异常。finally代码块中有一种情况下是不会执行的,那就是在try-catch中执行了System.exits(0)语句。
- throw 抛出异常
throw关键字用于在方法中声明抛出(自定义)异常的实例对象。程序在throw语句后停止执行,后面的语句不执行。 - throws抛出异常
如果方法体本身可能发生异常但没有处理异常的能力,则需在方法声明中将异常抛出。