JavaSE-Java中的错误处理机制

基本异常处理语法和过程

Java中的错误处理机制针对的错误是指非编译型错误,即非语法类错误。类似于除零错,即在除法运算时不可以除以0,Java在遇到此类错误会出现以下情况:例:System.out.println(16 / 0);

这里的ArithmeticException即为Java的内部异常类,异常名称为冒号后的“by zero”(除零错)。

上面这种处理错误的方法是抛出异常,还有另一种方法是抓取异常(try...catch)。且我们可以自己定义这种错误的处理:

        int m;
		int n;
		
		Scanner in = new Scanner(System.in);
		m = in.nextInt();
		n = in.nextInt();
		
		int result;
		try {
			result = m / n;	
			System.out.println(result);
		} catch (ArithmeticException ae) {
			System.out.println("被除数不可以使用0 !!!");
		}
		
		in.close();
		
		System.out.println("运算下一步的标志!");

上面就是我定义的遇到除零错时的处理,使用了try...catch的方法——try{可能有异常的语句;}catch(错误的类 形参){遇到异常时执行的语句}。使用这种方法的好处在于遇到异常、抓取异常之后可以继续运行下面的语句,而不是直接结束运行!如下所示:如果使用threw抛出异常的话就会直接结束运行!

下面这三个图对比了不同情况下的程序流程:

运行时异常与非运行时异常

Java内部已经定义了很多异常类

总体可分为两大类:非运行时异常和运行时异常;对于非运行时异常,Java编译器需要编程着自己完成异常的处理工作,否则无法编译。而对于运行时异常则无需编程者进行异常处理,在程序运行时遇到异常情况会立刻停止运行,然后交由JVM处理!

自定义异常

在需要的时候我们可以自己定义异常类,当我们使用Exception类作为基类时我们所定义的异常为“检查型异常”,而使用RuntimeException派生出的为“运行时异常”。建议定义检查型异常,方便编程者对异常进行抓取及处理。而如何定义一个异常类则比较简单,我们可以选择Exception为基类,派生出一个属于我们自己的异常类,如下:

public class TestRun extends Exception {

	public TestRun() {
		// TODO Auto-generated constructor stub
	}

	public TestRun(String arg0) {
		super(arg0);
		// TODO Auto-generated constructor stub
	}

	public TestRun(Throwable arg0) {
		super(arg0);
		// TODO Auto-generated constructor stub
	}

	public TestRun(String arg0, Throwable arg1) {
		super(arg0, arg1);
		// TODO Auto-generated constructor stub
	}

	public TestRun(String arg0, Throwable arg1, boolean arg2, boolean arg3) {
		super(arg0, arg1, arg2, arg3);
		// TODO Auto-generated constructor stub
	}

 标注的TODO就是我们自己对异常的处理,初级阶段我们可以删除掉,选择使用已经编写好的基类的方法。

这里存在一处异常的原因是需要一个序列号来保证异常类的可序列化!

添加之后即可完成一个自定义的异常类,下面对他进行测试:

public static void main(String[] args)  {
		System.out.println("在异常发生前 !");
		
		Complex c1 = new Complex(1.3, 1.5);
		Complex c2 = new Complex(0.0, 0.0);
	try {
		c1.div(c2);
		System.out.println("异常发生了 !");
	} catch(ComplexDividedByZeroException ce){
		System.out.println("除零错 !");
	} finally {
		System.out.println("异常发生了 !");
	}
		System.out.println("在异常出现后 !");
	}

可以看到我们自己定义的异常类也可以完成异常处理工作。

异常处理的选择

对异常的处理有两种选择,抛出和抓取。一般来说,如果一个异常在本方法有处理的安排,而且这个异常不再向上一级方法(调用此方法的方法)抛出,那么我们选择抓取异常。如果本方法没有处理它的安排,那么可以分为两种情况,一种是这个异常不会影响后续代码的逻辑和执行,那么就直接捕获,且可以在catch中什么都不写。另一种是会产生巨大影响,那么我们就需要抛出异常,且需要逐级抛出,来终止程序,以免影响后面的程序运行。

还有一种简单的处理方法:能处理则处理,不能处理则抛出!

异常中的finally

在我们自定义的异常测试中存在这样一段代码:

try {
		c1.div(c2);
		System.out.println("异常未发生 !");
	} catch(ComplexDividedByZeroException ce){
		System.out.println("发生了除零错 !");
	} finally {
		System.out.println("异常发生了 !");
	}

 这是一个抓取异常的结构,但是存在一个特殊的finally关键字,他的含义是无论异常是否发生,finally中的语句都执行,我们可以把发生异常时必须执行的语句放在finally中!比如关闭资源等操作。

在以后越来越多的编程中我们会慢慢体会到异常处理的内涵!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值