; }
4.4.3 throws 关键字
针对上面的例子, 我们假设 TestException 类与 Test 类不是同一个人写的, TestExc类不是同一个人写的, TestExc针对上面的例子, 写 类的人, 方法时, ption 类的人, main 方法中调用 Test 类的 devide 方法时, 在 怎么能知道 devide 方法有可 能出现异常情况呢? 语句去处理可能发生的异常呢? 能出现异常情况呢?他又怎么能够想到要用 try catch 语句去处理可能发生的异常呢?
问题可以这样解决, 类的人, 方法时, 问题可以这样解决,只要写 Test 类的人,在定义 devide 方法时,在 devide 方法参数 关键字声明一下,该函数有可能发生异常及异常的类别。这样,
列表后用 throws 关键字声明一下,该函数有可能发生异常及异常的类别。这样,调用者在 调用该方法时, try… 语句进行处理,否则,编译将无法通过。 调用该方法时,就必须用 try…catch 语句进行处理,否则,编译将无法通过。如下面的程 序代码: 序代码:
public class TestException { public static void main(String [] args) { int result = new Test().devide( 3, 1 ); System.out.println(“the result is” + result ); } } class Test { public int devide(int x, int y) throws Exception { int result = x/y; return x/y; } }
编译上面的程序,将出现如下的编译错误。 编译上面的程序,将出现如下的编译错误。 如下的编译错误
TestException.java:5: unreported exception java.lang.Exception; must be caught or declared to be thrown int result = new Test().devide( 3, 1 ); ^ 1 error
读者应注意一下出错的行号,就能够发现错误的位置。尽管我们已经将传给 读者应注意一下出错的行号,就能够发现错误的位置。尽管我们已经将传给 devide 函 程序在运行时不可能发生错误, 数中
的第二个参数改为了 1,程序在运行时不可能发生错误,但由于定义 devide 函数时声 明了它有可能发生异常, 语句进行处理,这叫防患于未然。 明了它有可能发生异常,调用者就必须使用 try…catch 语句进行处理,这叫防患于未然。 将
程序作如下修改: 将程序作如下修改:
public class TestException { public static void main(String [] args) { try { int result = new Test().devide( 3, 1 ); System.out.println(“the result is” + result ); } catch(Exception e) { e.printStackTrace();//很多人为了简单,不写这一句。 很多人为了简单,不写这一句。 很多人为了简单 } }
}
编译上面的程序,没有任何问题了。 编译上面的程序,没有任何
问题了。
小经验:很多人确信自己的程序中不会发生某种异常,try… 小经验:很多人确信自己的程序中不会发生某种异常,try…catch 语句似乎成了应对 编译器而不得已的手段,为了简单, 代码块中什么也不写, 编译器而不得已的手段,为了简单,他们往往在 catch 代码块中什么也不写,就象上面标 注的那样。try… 成了一种摆设。作者强烈要求读者养成良好的编程习惯, 注的那样。try…catch 成了一种摆设。作者强烈要求读者养成良好的编程习惯,不要回避 这一点辛劳 贪图这么一点时间。 代码块中,最好有处理异常的代码,否则, 这一点辛劳,贪图这么一点时间。在 catch 代码块中,最好有处理异常的代码,否则,一 旦程序在运行过程中出现了异常,导致最终运行结果与我们期望的不一致, 旦程序在运行过程中出现了异常,导致最终运行结果与我们期望的不一致,我们就很难发 现问题的原因了。 现问题的原因了。 throws 关键字的其他用处 如果一个方法中的语句执行时可能生成某种异常 但是并不能确定如何处理, 异常, 如果一个方法中的语句执行时可能生成某种异常,但是并不能确定如何处理,则此方 法应声明抛出异常 表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。 异常, 法应声明抛出异常,