异常概述
异常是运行是在代码序列中引起的非正常情况.换句话说,异常是运行时错误.
Java异常是用来描述在一段代码中发生的异常情况(也就是错误)的对象.当出现引起异常的情况时,就会创建用来表示异常的对象,并在引起错误的方法中抛出异常对象.
方法可以选择自己处理异常,也可以继续传递异常.
异常类型
所有异常类型都是内置类Throwable的子类.Throwable位于异常类层次中的顶部.紧随Throwable之下的两个子类,它们将异常分为两个不同的分支.
一个分支是Exception类,这个类既可以用于用户程序应当捕获的异常情况,也可以用于创建自定义异常类型的子类.Exception有一个重要的子类,名为RuntimeException.
另一个分支是Error类,该类定义了在常规环境下不希望有程序捕获的异常.Error类型的异常有Java运行时系统使用,指运行环境本身出现了某些错误.
未捕获的异常
int d = 0;
int a = 42 / d;
上述语句执行时,系统检测到试图除以零时,它会构造一个新的异常对象,然后抛出异常java.lang.ArithmeticException: / by zero
如果没有即时捕获处理,程序会立即终止运行.
捕获异常
使用try和catch来捕获异常.
try {
int d = 0;
int a = 42 / d;
} catch (Exception e){
System.out.println("程序出现了异常");
}
这个时候你就会发现,程序并没有终止运行,而是执行了catch代码中的代码.
自己处理异常有两个优点:
1.允许修复错误.
2.阻止程序自动终止.
多条catch字句
try {
int d = 0;
int a = 42 / d;
} catch (Exception e){
System.out.println("Exception");
} catch (ArithmeticException ae){
System.out.println("ArithmeticException");
}
上面我只是举了一个例子,如果程序先捕获了第一个catch的异常,那么程序不回再去捕获第二个catch的异常,以此类推.
我这是在举例子,因为Exception是所有异常的父类所以绝对不可能后捕获ArithmeticException异常的.
手动抛出异常
使用throw关键字.
try {
throw new ArithmeticException();
} catch (ArithmeticException ae){
System.out.println("ArithmeticException");
}
上述代码中我们手动抛出了ArithmeticException异常,而Java中所有异常都是对象.所以我们要创建ArithmeticException对象并抛出.
引发异常但不处理
使用throws关键字
public void testMethod() throws ArithmeticException {
}
上述代码我们的这个方法执行的时候发生了异常,但是我们不做处理,并且将异常向上抛(抛给调用此方法的方法).
如果我们的方法中使用了自定义异常类,那么我们也需要向上抛出.
自定义异常类
class TestExcption extends Exception{
public TestExcption(){}
public TestExcption(String info){
super(info);
}
}
throw和throws的区别
1.throws使用在函数上.
throw使用在函数内.
2.throws抛出的是异常类,可以抛出多个,用逗号隔开.
throw抛出的是异常对象.
finally
使用finally可以创建一个代码块,改代码块会在执行try/catch代码块之后,并在执行try/catch代码块后面的代码之前执行.也就是说 不管是否有异常抛出,都会执行finally代码块.
try{
} catch (Exception e) {
} finally {
}