java复习总结之异常

一.异常分支

        中图可看到,所有异常都继承Throwable,下层有两个大分支。

        1.Error 错误类:是指java运行时产生的系统内部错误和资源耗尽的错误,这样的错误是无法修改的,只能终止程序。

        2.Exception 异常类:它表示程序本身可以处理控制的异常,在java开发中进行的异常处理,主要针对Exception和它的子类。在Exception子类中有一个特殊类RuntimeException,它表示程序运行时错误,其他子类都是编译时异常。

        在RuntimeException中常见异常有:NullPointerException(空指针),ArrayIndexOutOfBoundsException(数组越界),ClassCastException(类型转换错误)

二.异常捕获

      在程序中发生了异常,为了可以让程序继续执行,java提供了异常捕获。

     try {

           //执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容  

      } catch (Exception e){ 

            //除非try里面执行代码发生了异常,否则这里的代码不会执行

      } finally { 

              //不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally 

       } 

      案例:

public class Test {
	public static void main(String[] args) {
		int i = 0;
		String[] str = {"a","b"};
		
		try {
			System.out.println("----程序开始----");
			i++;
			System.out.println(str[2]);  //数组越界,抛出异常
		}catch (Exception e) {  //捕获异常
			//打印异常信息
			e.printStackTrace(); 
			i++;
			
			//开启return,则当finally代码块执行完毕,才会调用,面试常见题
			//return;
		} finally { 
			//无论是否发生异常,或者return都会执行
			System.out.println("i = "+i);
		}
		System.out.println("----程序继续走----");
	} 
				
}

执行结果:

----程序开始----
java.lang.ArrayIndexOutOfBoundsException: 2 at cs.test.Test.main(Test.java:12)
i = 2
----程序继续走----

三.抛出异常

    抛出异常分为throws(方法抛出)和throw(行内抛出)

    1.throws抛出异常,在方法头部添加

      案例

public class Test {
	public static void main(String[] args) {
		//调用方法如果抛出异常,在调用时要么捕获异常,要么继续抛出异常
		try {
			divide(1,0); 
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static int divide(int a, int b) throws ArithmeticException {
		//因为除数可能存在为0,所有在方法头抛出一个算术异常
		return a/b;
	}
}

     运行结果:

            java.lang.ArithmeticException: / by zero  at cs.test.Test.divide(Test.java:15) at cs.test.Test.main(Test.java:7)

     2.throw抛出异常,在行内添加

public class Test {
	public static void main(String[] args) {
		//调用方法如果抛出异常,在调用时要么捕获异常,要么继续抛出异常
		try {
			int a = 2;
			int b = 0;
			if(b == 0) {
				throw new DivideException("除数不能为0");//行内抛出异常
			}
			System.out.println(a/b);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
//自定一异常类,在系统异常不够使用时可以自定义异常,继承Exception就行
class DivideException extends Exception {
	
	public DivideException() { //定义一个无参构造函数
		super();
	}
	
	public DivideException(String message) {//定义一个有参构造函数
		super(message);
	}
}

  运行结果

     cs.test.DivideException: 除数不能为0  at cs.test.Test.main(Test.java:10)

转载:

      执行顺序分析 https://www.cnblogs.com/superFish2016/p/6687549.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值