程序中总避免不了出现各种意想不到的状况引发的错误,java中的错误以对象方式呈现为java.lang.Throwable的各种子类实例.
只要我们能捕捉包装错误的对象,就可以针对改错误做一些处理,如,试恢复正常流程,进行日志记录,以某种形式提醒用户.
话不多说,下来我们看一个简单的例子!
1.用户可以连续输入整数,最后输入0结束后会显示输入数的平均值
package dongmengyuan;
/**
* Created by dongmengyuan on 16-11-23.
*/
import java.util.Scanner;
public class Average {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double sum = 0;
int count = 0;
while(true) {
int number = input.nextInt();
if(number == 0) {
break;
}
sum += number;
count++;
}
System.out.printf("平均 %.2f%n",sum/count);
}
}
正确输入每个整数,输出预期结果:
输入错误的话,
错误第一行,Exception in thread “main” java.util.InputMismatchException.
Scanner对象的nextInt()方法,可以将用户输入的下一个字符串剖析为int值,出现这个错误信息,表示不符合Scanner对象预期.
java中所有错误都被打包为对象,我们可以用try,catch代表错误对象后做出处理.
package dongmengyuan;
/**
* Created by dongmengyuan on 16-11-23.
*/
import java.util.*;
public class Average3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double sum = 0;
int count = 0;
while(true) {
try {
int number = input.nextInt();
if(number == 0) {
break;
}
sum += number;
count++;
}
catch (InputMismatchException ex) {
System.out.printf("略过非整数输入 %s%n",input.next());
}
}
System.out.printf("平均 %.2f%n",sum/count);
}
}
执行结果为
//执行完catch区块之后,由于还在while循环中,所以还可以继续下一个循环流程
try,catch总结
运行程序时,JVM会尝试执行try区块中的程序代码,如果发生错误,执行程序会跳离错误发生点,然后比较catch括号中声明的类型,是否符合被抛出的错误对象类型,如果是的话,就执行catch区块中的程序代码,执行完并不会再返回try区块.