Java异常——try-catch-finally
1. 结构
public void method() {
try {
// 代码段1
// 产生异常的代码段2
}catch(异常类型 ex) {
// 对异常进行处理的代码段3
}finally {
// 代码段4
}
}
其中:
(1) try块:用于捕获异常
(2) catch块:用于处理try捕获到的异常
(3) finally块:无论是否发生异常,代码总能执行
注:try块后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。
2. 案例:定义两数之商
public class TryDemoOne {
public static void main(String[] args) {
// 要求:定义两个整数,接受用户的键盘输入,输出两数之商
Scanner input=new Scanner(System.in);
System.out.println("=====运算开始=====");
try{
System.out.print("请输入第一个整数:");
int one=input.nextInt();
System.out.print("请输入第二个整数:");
int two=input.nextInt();
System.out.println("one和two的商是:"+ (one/two));
}catch(ArithmeticException e){
System.exit(1);//终止程序运行
System.out.println("除数不允许为零");
e.printStackTrace();
}catch(InputMismatchException e){
System.out.println("请输入整数");
e.printStackTrace();
}catch(Exception e){
System.out.println("出错啦~~");
e.printStackTrace();
}finally{
System.out.println("=====运算结束=====");
}
}
}
注:
(1) 异常Exception e
:所有异常,要放在最后边,否则会报错;
(2) 异常ArithmeticException e
:算数异常;
(3) 异常InputMismatchException e
:输入匹配错误异常;
(4) 打印错误堆栈信息:e.printStackTrace();
。
3. 常见异常类型及原因分析
ArithmeticException
(1) 异常说明:数学运算异常
(2) 出现条件:涉及到数学运算的地方可能出现失误,比如程序中出现了除以零这样的运算。
NumberFormatException
(1) 异常说明:数字格式化异常
(2) 出现条件:涉及到类型转换时,比如不符合转换格式的字符被转换成数字。
ArrayIndexOutOfBoundsException
(1) 异常说明:数组下标越界异常
(2) 出现条件:涉及到使用超出数组下标范围的下标。
NullPointerException
(1) 异常说明:空指针异常
(2) 出现条件:当使用了未经初始化的对象或者是不存在的对象时。
ClassCastException
(1) 异常说明:类型转换异常
(2) 出现条件:如向下转型时,转换对象无法完成正常转换。
ArrayStoreException
(1) 异常说明:数组中包含不兼容的值的异常
(2) 出现条件:数组中实际传入的数据与预定不符,譬如子类数组经过向上转型。后,传入父类对象。
InputMismatchException
(1) 异常说明:输入格式错误的异常
(2) 出现条件:接收数据与预期格式不符时。
FileNotFoundException
(1) 异常说明:文件未找到异常
(2) 出现条件:操作文件内容时发现文件不存在。
- 注:try…catch里面定义的变量外部可以使用吗?
答:不可以,try…catch代码块中定义的是局部变量,只能在其代码块中应用。
4. 终止finally执行的方法
System.exit(1);
try{
...
}catch(ArithmeticException e){
System.exit(1);//终止程序运行
System.out.println("除数不允许为零");
e.printStackTrace();
}
注:System.exit(1);
表示当前程序无条件终止运行。
5. return关键字在异常处理中的作用
public class TryDemoTwo {
public static void main(String[] args) {
// TODO Auto-generated method stub
int result=test();
System.out.println("one和two的商是:"+ result);
}
public static int test(){
Scanner input=new Scanner(System.in);
System.out.println("=====运算开始=====");
try{
System.out.print("请输入第一个整数:");
int one=input.nextInt();
System.out.print("请输入第二个整数:");
int two=input.nextInt();
return one/two;
}catch(ArithmeticException e){
System.out.println("除数不允许为零");
return 0;
}finally{
System.out.println("=====运算结束=====");
return -100000;
}
}
}
运行结果:
=====运算开始=====
请输入第一个整数:12
请输入第二个整数:0
除数不允许为零
=====运算结束=====
one和two的商是:-100000
这里发现:finally中写return虽然不报错,但是不论有无异常最后都会返回finally中的return,因此,在逻辑上,finally中最好不要写return。