由一句话带来的三种思考,起初看异常处理看得云里雾里,对于try catch() 更是不知所谓,最近看多线程以及到论坛查找,就这句话有了一些最基本的理解。
在java中,异常存在三种形式:
1、error,主要有jvm形成,不易捕获;
2、runtime exception,运行异常与环境有关,编译时无法检查,而且发生的情况复杂,JVM自动处理,无需人工捕获;
3、exception ,需要捕获的异常。
首先exception 是程序应该捕获的异常,如果JVM产生了exception且没有捕获,那么程序将自动停止。try{ }中加入运行代码——可能会发生exception异常的的代码,如果这段代码存在异常,JVM将抛出这个异常,而catch( )将捕获抛出的异常,程序继续运行。换句话而言,try{}—catch()就是排除运行代码中的异常,catch(exception e)将抛出的异常显示出来。
throw与try catch
两者最大的区别就是throw直接抛出异常,无需自己处理,有程序以外的代码处理,至于什么异常开发者也不会知道,如果没有代码处理抛出的异常,程序将自动结束;
try catch可以捕获抛出的异常,并显示出来,开发者可以很明显的了解自己代码的异常。
throw与throws
void doA(int a) throws Exception1,Exception3{
try{
...... }catch(Exception1 e){
throw e;
}catch(Exception2 e){
System.out.println("出错了!");
}
if(a!=b)
throw new Exception3("自定义异常");
}
代码中Exception1、 2、 3都可存在错误
如果产生Exception1异常,则捕获之后再抛出,由该方法的调用者去处理。
如果产生Exception2异常,则该方法自己处理了(即System.out.println("出错了!");)。所以该方法就不会再向外抛出Exception2异常了,void doA() throws Exception1,Exception3 里面的Exception2也就不用写了。
而Exception3异常是该方法的某段逻辑出错,程序员自己做了处理,在该段逻辑错误的情况下抛出异常Exception3,则该方法的调用者也要处理此异常。
throws是用在异常说明之后,若存在异常,将由方法的调用者执行;
throw是用在方法体内,抛出后由程序外的代码处理。
throws可能存在异常需要抛出,强调可能;
throw 则是抛出了一些具体的异常——一些已知的异常,执行throw代码就是抛出异常。