第二节、异常处理实例分析
以下是Java中一个错误处理的例子:
[MultiCatch.Java] :
package Examples;
public class MultiCatch{
public static void main(String[] args){
try{
int a=args.length; //将字符串数组args的长度赋给int变量a
System.out.println("args的长度是 : "+a); // 打印a 的值
int b=36/a; //用a除36,当main方法无参数传入时会出现被零除错误
System.out.println("args的第2个参数是: "+args[1]); //打印args第二个参数,
}catch(ArithmeticException e){
System.out.println("无参数传入,args.length=0,出现错误 ");
System.out.println("Divide by 0: "+e);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("传入参数少于2个,出现错误 ");
System.out.println("Array Index Out of Bounds: "+e);
}finally{
System.out.println("finally代码块:无论有无异常,这里仍然会执行");
}
System.out.println(“程序没有被终止!”);
}
}
下面是运行在三种不同情况下程序的输出:
C:/javaApp>java Examples.MultiCatch
a = 0
无参数传入,args.length=0,出现错误
Divide by 0: java.lang.ArithmeticException: / by zero
finally代码块:无论有无异常,这里仍然会执行
程序没有被终止!
C:/javaApp>java Examples.MultiCatch test01
a = 1
传入参数少于2个,出现错误
Array Index Out of Bounds: java.lang.ArrayIndexOutOfBoundsException: 1
finally代码块:无论有无异常,这里仍然会执行
程序没有被终止!
C:/javaApp>java Examples.MultiCatch test01 test02
a = 2
args的第2个参数是: test02
finally代码块:无论有无异常,这里仍然会执行
程序没有被终止!
对比VB和Java中的异常处理,我们可以要发现Java中的异常处理机制非常灵活和方便,而且不会中止程序的运行。但要注意的是,如果程序中出现异常时,我们没有为我们的程序提供异常处理,或找不到匹配的异常处理程序,那么异常最终会被Java运行时系统的默认处理程序捕获并终止程序运行。默认处理程序显示一个描述异常的字符串,打印异常发生处的堆栈轨迹并且终止程序。你可以尝试将上面例子中的第二个catch块去掉,那么运行在只有一个参数的情况下会出现错误,而且try/catch/finally代码块后的语句: System.out.println(“程序没有被终止!”); 将不会执行。
如果一个finally块中出现或抛出(throw)了一个异常,那么这个异常会代替前面try代码块任何正在被抛出过程中的异常。如果一个finally块内使用一个return语句,那么即使一个异常已经被抛出并且还没有处理,这个方法也会正常返回。
下面是另外一个例子:
[ExceptionDemo.java]
package Examples;
import java.util.Random; //导入 Random类
public class ExceptionDemo{
public static void main(String[] args){
int a=0,b=0,c=0;
Random r=new Random(); //创建Random类的一个实例
for(int i=0;i<10;i++){
try{
b=r.nextInt(); //使用Random类实例的nextInt()方法来获取一个随机
c=r.nextInt(); // int 类型整数
a=12345/(b/c); //用 c除b,结果用来除12345,以增加被零除错误机会
}catch(ArithmeticException e){
// e.printStackTrace(); 这个语句被我注释掉了,它的作用后面有讲
System.out.println("Division by zero."); // 打印出错误,
a=0; //这里设置a为零
}
System.out.println(" a is : "+a);
}
}
}
编译运行后的某次输出如下(每次运行的结果都不相同):
a is : -2469
a is : -12345
a is : -6172
a is : -6172
a is : -1234
a is : 12345
Division by zero.
a is : 0
a is : -6172
a is : -12345
Division by zero.
a is : 0
上面程序中的“e.printStackTrace();”语句如果没有注释掉的话,那么在每句“Division by zero.”前会输出:
java.lang.ArithmeticException: / by zero
at Examples.ExceptionDemo.main(ExceptionDemo.java:11)
java.lang.ArithmeticException指明异常类型,后面的“/ by zero”是具体异常描述
Examples.ExceptionDemo.main指明异常在Examples包中的ExceptionDemo类main方法中
最后指明 java 文件名称及出现错误代码位置: ExceptionDemo.java 中的第 11 行。