格式:方法名() throws 所有潜在异常类型列表
异常说明将Java中的异常分为了两类,一类是被检查的异常,即Exception及所有继承自它的异常;另一类是不受检查的异常,即RuntimeException,即运行时异常。怎么理解呢?
说白了就是,被检查的异常只要你在函数中要用到throw抛出异常或者说你调用的函数利用了throw抛出了异常,那么你就必须在函数后面加上throws关键字并在后面列出所有可能抛出的异常;而不受检查的异常就是你抛出它的时候不用做特别说明,就像上面除法的例子一样。
这种自顶向下的约束,可以保证Java代码一定水平的异常正确性。但是这里是有争议的,有些人认为这样好,但有些人认为这样会影响程序员的编程效率,因为有时候你根本就不知道你捕捉的是什么异常,也不知道该怎么处理,但是编译器会强制要求你加上这些模块。
finally关键字
finally关键字常用数据库的哥们肯定懂,一般我们在finally里要关闭数据库连接或者做一些清理工作。关于finally我想说两点有趣的事情:
一、保证完成任务
为什么这么说finally关键字呢,就是因为无论在try语句中执行了什么命令,finally中的语句块一定会执行(这就确保了有些必要的清理工作),如:
public class MultipleReturns
{
public static void f(int i)
{
System.out.println("Initialization that requires cleanup");
try
{
System.out.println("Point 1");
if (i == 1)
return;
System.out.println("Point 2");
if (i == 2)
return;
System.out.println("Point 3");
if (i == 3)
return;
System.out.println("End");
return;
}
finally
{
System.out.println("Performing cleanup");
}
}
public static void main(String[] args)
{
for (int i = 1; i <= 4; i++)
f(i);
}
}
大家执行这段代码会惊奇的发现,即使try中代码调用了return命令但是finally也一定会执行。
二、嵌套try
public class Cleanup
{
public static void main(String[] args)
{
try
{
InputFile in = new InputFile("Cleanup.java");
try
{
String s;
int i = 1;
while ((s = in.getLine()) != null)
; // Perform line-by-line processing here…
}
catch (Exception e)
{
System.out.println("Caught Exception in main");
e.printStackTrace(System.out);
}
finally
{
in.dispose();//自定义
}
}
catch (Exception e)
{
System.out.println("InputFile construction failed");
}
}
} /*
* Output: dispose() successful
*/// :~
对于这个例子,我们看出我们要创建InputFile对象,当我们成功创建它时需要用dispose方法对其进行清理,然而如果失败时我们并不需要对其进行清理。倘若只有一个不使用嵌套try块,那么不管怎样finally都会执行。所以为了避免这种情况,上面的嵌套try语句就起到了作用。