`

Java学习系列(九)Java面向对象之异常机制详解

 
阅读更多

异常处理机制用来保障我们的程序更加健壮,无论用户怎么操作,都能保证我们的程序都能正常应对的一种处理机制。

一般格式如下:
try{ // 尝试让它执行业务处理,如果可以执行完成,就代表一切正常。
// 业务处理
}catch(异常1 e1){
// 进行异常1处理
}catch(异常2 e2){
// 进行异常2处理
}

举例说明1:

public class Test {
	public static void main(String[] args) {
		try {
			Double d1 = Double.parseDouble(args[0]);
			Double d2 = Double.parseDouble(args[1]);
			System.out.println("d1+d2=" + (d1 + d2));
		} catch (ArrayIndexOutOfBoundsException e1) {
			System.out.println("请输入两个数字!");
		} catch (NumberFormatException e2) {
			System.out.println("输入的必须是数字!");
		}
	}
}

 

 

Java异常机制的处理流程
出现异常时,系统会自动生成一个异常对象ex,然后由catch(异常类 e1) ex instanceof 异常类 判断是否为true,为true时传给catch块后的形参,并执行catch块中的代码。对于多个catch块捕捉异常,应该是先捕捉小(子类)的异常,再捕捉大(父类)的异常。通常发生异常时应从第一个自己写的程序位置开始查找并排错。【注意】对于一个异常,最多只有一个catch块捕捉到异常。

异常体系图:

异常处理的完整语法格式:

try{
// 业务处理
}catch(异常 ex){ //0~N个
// 进行异常1处理
}finally{ // 0~1个

}
注意:try不能独立存在,也就是说catch块和finally块必须有一个。
finally --通常用于回收(关闭0资源,JVM会保证【finally块总会得到执行 --不管有无return语句】,但如果遇到System.exit(0);(用于退出JVM)就会阻止finally语句的执行。

 

异常的分类
checked异常:没有完善错误处理的代码,不会得到执行的机会。--编译器会强制检查。
runtime异常:运行时异常。
checked异常可以更好地保证我们一定会对其进行异常处理,但checked也给编程带来繁琐:要么用throws声明抛出异常,要么显式用catch来捕捉。

异常转译

 

/**
 * @author lhy
 * @desription 自定义异常
 */
class MyException extends RuntimeException {
	public MyException() {
	}

	public MyException(String msg) {
		super(msg);
	}

	public MyException(String detailMessage, Throwable throwable) {
		super(detailMessage, throwable);
	}
}

public class Test {
	public static void main(String[] args) {
		test(args);
	}

	public static void test(String[] args) {
		try {
			Integer num1 = Integer.parseInt(args[0]);
			Integer num2 = Integer.parseInt(args[1]);
			System.out.println(num1 / num2);
		}
		
		// 先用catch來捕捉原有的異常,再用throw拋出一个自定义异常对象;
		// 这种做法也称为“异常转译”
		catch (ArrayIndexOutOfBoundsException ae) { // 数组下标越界异常
			throw new MyException("请输入两个数字");
		} catch (NumberFormatException ne) { // 数字格式异常
			throw new MyException("必须输入数字");
		} catch (ArithmeticException et) { // 算术异常
			throw new MyException("被除数不能为0");
		} finally {
			System.out.println("finally块总会得到执行"); 
		}
	}
}

【注意】(catch)捕捉的异常的范围一定要比抛出的异常范围大。
throws和throw的区别:
A。throws只能在方法签名中用,方法已经注意到了这几个异常,但目前不想处理该异常。
B。throw就是一条普通的语句,throw后紧跟【一个异常实例】。

 

结束语:今天内容比较简单,所以写的不是很多。明天开始学习IO。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics