异常(一)
Exception(一)
一、什么是异常?
异常是指程序在运行出现的错误,而不是我们在编译时出现的语法错误。
Throwable继承树:

异常类的继承关系:
Object 类的直接子类Throwable描述了所有被虚拟机抛出的非正常状
况。一般情况下很少用Throwable,而是使用它的两个子类Error、
Exception。
Error类指的是运行期间出现的严重错误。比如内存溢出,堆栈溢出。因为这类错误往往是毁灭性
的,所以Error类就没必要使用异常处理机制来处理。
而Exception类则是要使用异常处理机制来处理。
Exception分为两大子类():
1 以RuntimeException类为代表的非检查性异常。
2 以IOException类为代表的的检查性异常。
所谓的检查性是指编译器在编译时是否进行检查。如果编译器检查到你的代码中拥有检查性异常
那么必须进行异常处理否则编译不通过,检查性异常类:往往是用来处理意外发生的,例如:网络
中断,文件不存在,... 这些很平常又经常会发生的错误。对于这类错误我们就需要预先设置好处
理机制,以防止异常的出现。
而非检查性异常在编译时不检查,即使出错也会编译通过。非检查性异常类:往往是程序设计者的
疏忽造成的,例如:数组越界,整数除以0,...这类异常往往进行测试时就能解决。
对于异常类应该如何处理呢?
对于不同的异常,java采用不同的异常处理方式:
1 非检查性异常将由系统自动抛出,应用本身可以选择处理或者忽略该异常。
2 对于方法中产生的Error,该异常一旦发生JVM将自行处理该异常,因此java允许应用不抛出此类异常。
3 对于所有的检查性异常,必须进行捕获或者抛出该方法之外交给上层处理。也就是当一个方法存在异常时,
要么使用try-catch捕获,要么使用该方法使用throws或者throw将该异常抛调用该方法的上层调用者。
那么如何使用try-catch,throw,throws呢?
请往下看:
二、如何处理异常(大多数情况下都是在处理检查型异常)?
1 使用try-catch
捕捉异常,然后处理异常
try{
int[] a={9};
System.out.println(a[3]);
}
catch(ArrayIndexOutOfBoundsException e){//对异常进行捕获
System.out.println("数组溢出");//对异常进行处理
}
注:因为异常的种类不知一个所以try后面可以跟数个catch。
2 使用throw
抛出异常
一般出现在函数体内部,用于抛出指定的异常。
可以在一般方法内使用:
public void function(){//判断两个字符串内容是否相等,不相等则抛出一个NumberFormatException异常
String s="abc";
string b="cba"
if(s.equals(b)){
System.out.println(s);
}else{
throw new NumberFormatException();
}
}
也可以在try-catch中使用:
try{
int[] a={9};
System.out.println(a[3]);
}catch(ArrayIndexOutOfBoundsException e){
throw e;
}
/*使用try catch捕获异常,但是不处理直接处理异常而是往上抛交给上一层
的调用者来进行处理,可以说处理了但是处理的方法是将异常向上抛*/
注意:throw必须声明的是Throwable或者是其子类
例: throw new String("abc");会发生编译错误 ,因为String不是Throwable的子类
3 使用throws
声明异常
用于声明某个方法可能抛出的异常,然后上抛给上层调用它的程序处理
public static void function() throws IOException,...{//声明函数可能出现的异常,如果出现则向上抛
System.out.println("抛出了一个Exception");
throw new IOException();//抛出异常,这个异常由它外围的throws是继续上抛
}
public static void main(String[] args) {
try{
function();//调用函数,但是函数出现了异常
}catch(IOException e){//对异常进行捕获
System.out.println("已经进行异常处理");//对异常的处理
}
}
throws和throw的区别:
1 throws说明这个地方可能会抛出某个异常,而throw则是指定这个地方会抛出指定异常(但是它们都是
抛出没有处理异常,异常的处理由调用者来进行,而如果出现了一个意料之外的(throws没有声明的)
异常,那么这个异常将会一直逐层上抛,直到交给JVM);
2 throws出现在函数头部,throw出现在函数体内 ;
最后一个内容:finally关键字
finally的作用是无论是否捕获异常,finally内的代码都会执行。
常用的地方是回收资源,当一个程序使用了本地的资源时,突然产生了异常,那么就会
出现资源回收的问题,这时就要使用finally来回收资源了。
try{
...
}catch(Exception e){
...
}finally{
回收资源代码
}
注意:
1 不要在finally子句中使用return语句,因为这样会造成真正的返回值被覆盖的错误。
2 finally字句中千万不要抛出异常,否则整个try/catch块会抛出假异常(即finally
子句中抛出的异常)

浙公网安备 33010602011771号