java异常—异常基础知识
一.抛出异常
如果某个函数需要抛出异常,可以在函数名后加throw语句,执行抛出异常时,函数在“throw”语句之后立即停止执行,后面的任何语句都不会再执行。如:
public void divide(int dividend, int divider)
throws BadDividerException{
if(divider == 0){
throw new BadNumberException("除数不能为0");
}
return dividend / divider;
}
在上面的例子中,如果抛出BadDividerException,则不再执行 dividend / divider 。
二.捕获异常
如果函数A调用另一个抛出异常的函数B,则强制函数A要么传递异常,要么使用try-catch捕获异常,代码如下:
public void getDivide(){
try {
int result = divide(2,1);
System.out.println(result);
} catch (BadDividerException e) {
System.out.println(e.getMessage());
}
System.out.println("End");
}
在上面代码中,如果try中没有抛出异常,则会忽略catch块,即catch中代码不会执行。如果在try-中抛出一个异常,则执行catch中代码,当catch块执行完成时,程序继续执行catch块之后的代码。
三.传播异常:
如果我们对调用函数抛出的异常不想做任何处理,那么我我们可以将该异常继续抛出,这就叫异常传播,我们可以看以下代码:
public void getDivide() throws BadDividerException{
int ret = divide(2,1);
System.out.println(ret);
}
在调用divide()函数时,我们没有用try-catch捕获异常,而是声明getDivide()可以抛出BadDividerException异常。如果从divide方法抛出异常,程序执行仍会中断,即:System.out.println(result)将不再执行。
四.finally:
将finally加到try-catch后。无论有无异常产生,finally中的代码都会执行。如果在try或catch中有一个return语句,那么finally中的代码将方法返回之前执行。代码如下:
public void openFile(){
FileReader reader = null;
try {
reader = new FileReader(fileName);
int i=0;
while(i != -1){
i = reader.read();
System.out.println((char) i );
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("--- File End ---");
}
}
上面的示例中无论有无异常产生,reader都终将关闭。
五.异常的多重捕获:
在捕获异常时,可以为同一个try提供多个catch,代码如下:
try{
} catch (FileNotFoundException e){
} catch (IOException e){
}
在上面代码中,FileNotFoundException将由 catch (FileNotFoundException e)捕获, 除此之外,catch(IOException e)将捕获所有IOExceptions。