Java知多少(46)try和catch的使用
为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了。紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句。完成这个任务很简单,下面的程序包含一个处理因为被零除而产生的ArithmeticException 异常的try块和一个catch子句。
1 class Exc2 { 2 public static void main(String args[]) { 3 int d, a; 4 try { // monitor a block of code. 5 d = 0; 6 a = 42 / d; 7 System.out.println("This will not be printed."); 8 } catch (ArithmeticException e) { // catch divide-by-zero error 9 System.out.println("Division by zero."); 10 } 11 System.out.println("After catch statement."); 12 } 13 }
该程序输出如下:
1 Division by zero. 2 After catch statement.
注意在try块中的对println( )的调用是永远不会执行的。一旦异常被引发,程序控制由try块转到catch块。执行永远不会从catch块“返回”到try块。因此,“This will not be printed。”
将不会被显示。一旦执行了catch语句,程序控制从整个try/catch机制的下面一行继续。
一个try和它的catch语句形成了一个单元。catch子句的范围限制于try语句前面所定义的语句。一个catch语句不能捕获另一个try声明所引发的异常(除非是嵌套的try语句情况)。
被try保护的语句声明必须在一个大括号之内(也就是说,它们必须在一个块中)。你不能单独使用try。
构造catch子句的目的是解决异常情况并且像错误没有发生一样继续运行。例如,下面的程序中,每一个for循环的反复得到两个随机整数。这两个整数分别被对方除,结果用来除12345。最后的结果存在a中。如果一个除法操作导致被零除错误,它将被捕获,a的值设为零,程序继续运行。
1 // Handle an exception and move on. 2 import java.util.Random; 3 4 class HandleError { 5 public static void main(String args[]) { 6 int a=0, b=0, c=0; 7 Random r = new Random(); 8 9 for(int i=0; i<32000; i++) { 10 try { 11 b = r.nextInt(); 12 c = r.nextInt(); 13 a = 12345 / (b/c); 14 } catch (ArithmeticException e) { 15 System.out.println("Division by zero."); 16 a = 0; // set a to zero and continue 17 } 18 System.out.println("a: " + a); 19 } 20 } 21 }
显示一个异常的描述
Throwable重载toString( )方法(由Object定义),所以它返回一个包含异常描述的字符串。你可以通过在println( )中传给异常一个参数来显示该异常的描述。例如,前面程序的catch块可以被重写成1 catch (ArithmeticException e) { 2 System.out.println("Exception: " + e); 3 a = 0; // set a to zero and continue 4 }
当这个版本代替原程序中的版本,程序在标准javaJDK解释器下运行,每一个被零除错误显示下面的消息:
1 Exception: java.lang.ArithmeticException: / by zero
尽管在上下文中没有特殊的值,显示一个异常描述的能力在其他情况下是很有价值的——特别是当你对异常进行实验和调试时。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。