1 Java异常机制用到的几个关键字
1.1 try
用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
1.2 catch
用于捕获异常。catch用来捕获try语句块中发生的异常。
1.3 finally
finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。
- 只有在finally块执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果在try里面有System.exit(0)这样的语句,System.exit(0)是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然 finally 语句也不会被执行到。
- 如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
1.4 throw
用于抛出异常。
1.5 throws
用在方法签名中,用于声明该方法可能抛出的异常。
2 异常类结构体系
2.1 JAVA对不同的异常类采取不同的处理策略。
2.1.1 java.lang.Error
java.lang.Error意味着是很难恢复的严重错误,一般不由程序处理。
2.1.2 java.lang.Exception
- 继承RuntimeException类
RuntimeException意味着程序设计或实现问题,例如数组使用越界,算术运算异常(例如除0运算),空指针异常(即访问没有初始化的指针)等.正确设计与实现的程序不应该产生这些异常,处理的策略是纠正错误。
注意:RuntimeException异常不是必须被catch,就是说在声明语句returnType methodName([paramlist])throws exceptionlist中声明的异常,Exception一定要被处理,而RuntimeException异常则可以不被处理。
- 继承Exception
其他的异常通常是由环境因素引起的,如文件不存在,无效URL等.这类是由用户的误操作引起的,可以在异常处理中处理,例如,提示用户进行正确操作.它是编译器可以“感知”的异常,所以程序被要求必须捕获并处理这些异常。
例子 :
import java.io.*;
import java.util.*;
class B{
void s()throws RuntimeException{
throw new RuntimeException();
}
}
public class M{
public static void main(String args[])
{
B b=new B();
try
{
b.s();
}
finally
{
System.out.print(" here2");
}
}
}
import java.util.*;
class B{
void s()throws RuntimeException{
throw new RuntimeException();
}
}
public class M{
public static void main(String args[])
{
B b=new B();
try
{
b.s();
}
finally
{
System.out.print(" here2");
}
}
}
能产生结果 here2Exception in thread "main" java.lang.RuntimeException
at B.s(M.java:6)
at M.main(M.java:18)
import java.io.*;
import java.util.*;
class B{
void s()throws Exception{
throw new Exception();
}
}
public class M{
public static void main(String args[])
{
B b=new B();
try
{
b.s();
}
finally
{
System.out.print(" here2");
}
}
}
import java.util.*;
class B{
void s()throws Exception{
throw new Exception();
}
}
public class M{
public static void main(String args[])
{
B b=new B();
try
{
b.s();
}
finally
{
System.out.print(" here2");
}
}
}
编译时则会报错 M.java:18: 未报告的异常 java.lang.Exception;必须对其进行捕捉或声明以便抛出
b.s();
^
1 错误
《Effective Java》中给出的建议是:对于可以恢复的条件使用被检查异常,对于程序错误使用运行时异常。