异常的捕获
1) Java中的异常捕获
在Java中异常捕获有以下几种方法:
1.1 try…catch…块
用try来设定一段能够预防所有异常的程序。紧跟在try后面,可以有一个或多个catch子句来指定我们想要捕获的异常类型。
try…catch的格式一般为:
try{…}
catch(…){ … }
catch(…){ … }
…
Catch子句的目标是解决异常情况,把变量设到合理的状态,就像没有出错一样继续运行。如果一个子程序不处理没个异常,则返回到上一级处理,如此可以不断的递归向上直到最外一级.
例如:
try{ int a=100/0;}
catch(Exception e){ System. out. Println (e .getMessage()) ;}
上面这个程序中,首先,使用try来设定一个潜藏着异常的程序’int a=100/0”,接着使用catch语句来捕获这个异常。Catch子句的任务就是解决异常,把变量调整到一个相对来说比较合理的状态上,可以使程序像没有出错一样照常进行。当一个子程序不处理这个异常时,则要返回上一级继续处理,如此递归直到最外一级。实际上,java程序在激发一个异常的程序时,只是激发了一个对象而已,而在Java中只有Throwable这个超类的对象可以被激发。throwable类中包含了很多方法,上述例子中getMessage()方法就是其中一个,它的功能是打印出异常对应的信息。
这与C++中的try…catch语句一样:
例如:
void f(){throw ExceptionClass(“I’m a girl!”);}
try{f()}catch(ExceptionClass e){e.function()};
需要我们注意的是:在try{f()}catch(…){}语句中。Catch后面的…表示所有可以捕获的异常。这样我们可屏蔽掉所有没出现处理的异常。当异常捕获之后,我们可以用throw语句再一次抛出,只不过现在这个throw语句不带有任何参数,如:try(f())catch(…){throw()}。
1.2.try…catch…finally块
在这个固定的程序块中,finally关键字起着很重要的作用,这也是C++与Java的最大的区别,因为C++中不存在finally块,因此在这儿我们只需要对Java中的finally块详细探讨一下。
我们知道,finally可以保证Java程序不管发生什么异常,总会使代码照常执行,这是对Java异常处理块的最佳补充。还有一点值得一提就是,finally可以维护对象的内部状态,还可以清理非内存资源。如果您不使用finally那么您必须编写代码来释放那些非内存资源:
例如:
classWithoutFinally {
publicvoidfoo1()throwsIOException {//在任一个空闲的端口上创建一个套接字
ServerSocketss=newServerSocket(0);
try{
Socketsocket=ss.accept(); //此处的其他代码...
}
catch(IOExceptione){ ss.close(); //1
throw(); } //抛出异常;
ss.close(); //2
}
}
在以上这段程序中,我们首先创建了一个套接字,然后在try语句中调用accept方法,但是必须保证在退出这个方法之前关闭这个套接字,以防止资源出现漏洞。紧接着,我们调用close方法来完成这项任务。但是,一旦在try块中出现一个异常,我们该怎么办呢?因此,我们必须捕获这个异常,并在重新发现这个异常之前,在//1处插入对close的另一个调用。这样就可以确保在退出该方法之前关闭该套接字。
我们发现上面这段程序很烦索而且潜藏着很多错误,但是,finally子句可以解决这个问题。下面是上述例子加了finally语句之后的程序代码:
classWithFinally {
publicvoidfoo2()throwsIOException;
{ //在任一个空闲的端口上创建一个套接字;
ServerSocketss=newServerSocket(0);
Try{
Socketsocket=ss.accept(); }
finally{ ss.close();
}
}
}
在程序中加入finally块不管try块内是否发出异常,都可以确保close方法总被执行。并且可以确保在退出该方法之前close方法总被调用。这样我们就可以保证该套接字被关闭并且还防止了资源的泄漏。我们注意到,在此方法中有try语句,而没有发现catch语句的影子,这是因为第一个示例中提供catch块只是为了关闭套接字,但现在finally已经完成该任务了,所以再加catch就是多余的。但是如果您在程序必须使用一个catch块,则finally块中的代码会在catch块后执行。
在这里我需要强调的一点是,在Java中进行异常处理时,finally块必须要与try或try/catch配套使用,另外,也不能先退出try块而不执行finally块。如果finally块存在,则它总是会被执行的。但是有一种方法可以退出try块而不执行finally块。如果try内部是一条System.exit(0);语句,则应用程序被终止,finally语句也不被执行。还有一种情况就是如果在try块执行期间突然断电,finally也不会被执行。)
结束语:
因此,当我们在进行程序设计时,如果我们所设计的程序中存在着一些异常,我们最好使用Java来进行程序设计,因为Java中的finally在异常处理过程中起着至关重要的作用。它不仅可以保证该套接字被关闭并且还防止了资源的泄漏。