------- android培训、java培训、期待与您交流! ----------
异常
JAVA中的异常
Error
该类异常是较严重的异常,叫做Error,该类异常不应该是试图捕获,因为通常比较严重,程序会自动终止运行。该类异常是Throwable的子类。
该类只有4个重载的构造方法,通常用于构造判断条件。同时,该类异常不用在throws中声明
Exception
该类异常是预知的可能出现的异常,写作Exception,也是类Throwable的子类。该类异常可以被捕获。并且通常在编译期就会被捕获处理。
如果是使用throws抛出异常,需要在throws后声明抛出的异常类型。
RuntimeException
该类异常指的是运行期异常,该类异常在编译期并不捕获,而在运行期才捕获。该类异常不需要在throws中声明。
该类是Exception的子类
异常的处理
try……catch代码块捕获
基本格式如下: try{
可能出现异常的代码块
}catch( 要捕获的异常的类型1 ){
捕获后要做的动作
}catch( 要捕获的异常的类型2 ){
捕获后要做的动作
}
程序会先运行try中的代码块,如果出现异常,并且异常在是catch中声明要捕获的类型,则在捕获后执行相应的catch代码块中的内容。
需要注意的是,因为异常之间存在继承关系,所以子类异常应该放在父类异常之上,否则子类异常永远不会被捕获。
如:
try {
file.canRead();
} catch (Exception e) {
System.out.println("出现异常");
} catch (IOException e) {
System.out.println("出现IO异常");
}
IO异常永远也不会被捕获到,所以,应该改为:
try {
file.canRead();
} catch (IOException e) {
System.out.println("出现IO异常");
} catch (Exception e) {
System.out.println("出现异常");
}
throws声明抛出异常
该关键字应用于方法名后。格式如下:
方法名( 形式参数 ) throws 异常列表……
throws会将异常捕获列表中出现的异常抛出给函数的调用者。
public static void main(String[] args) throws IOException{
File file = new File("a.ex");
file.createNewFile();
file.delete();
}
此处,main方法声明抛出IOException,若存在IOException的对象,则会被抛给main方法的调用者。
throw语句
该语句可以抛出一个异常,通常使用的方法如下:throw new 一个要抛出的异常。
如:
public static void main(String[] args) throws IOException{
throw new IOException();
}
此处会抛出一个IOException对象给main方法,并由main方法抛给其调用者。
4、finally代码块
finally代码块的语句永远会被执行,无论是否发生异常。
finally代码块使用时必须放在try……catch代码块之后,若无try……catch代码块,则finally代码块也无法使用。
一般格式:
try {
可能发生异常的代码
} catch (Exception e) {
处理异常的操作
}
finally{
一定会执行的操作
}
自定义异常
只要将类声明为Throwable的子类,就能自定义异常。将类声明为RuntimeException的子类,就能自定义运行时异常。
例:
public static void main(String[] args) {
try {
throw new NewException();
} catch (NewException e) {
System.out.println("捕获了新异常");
}
finally{
}
}
class NewException extends Throwable{
}
运行结果会显示:捕获了新异常
注意事项
1、try……catch代码块与throws抛出异常,两种方案通常只使用一种,即,如果使用try……catch捕获处理异常,则不使用throws声明抛出异常,反之不用捕获处理。2、finally一定会被执行,但此过程可以不是程序返回的结果。
如:
public static void main(String[] args) {
System.out.println(testExcuteSequence());
}
private static int testExcuteSequence() {
int x = 0;
try {
x = 10;
throw new NewException();
} catch (NewException e) {
x = 30;
return x;
} finally {
x = 20;
}
}
程序的返回结果会是 30。
因为执行的顺序是:
try前代码——》try中代码——》发生异常——》catch代码块——》返回了x——》finally代码块——》调用者的代码
如果在finally块中加上一个输出语句,会发现输出20,再输出30。