黑马程序员-Exception

                    黑马程序员-Exception

 

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

 

概念:

      异常:在程序运行中出现的不正常情况,就叫异常。java是面向对象的语言,所以在描述异常时也将其封装成了具体的对象。并且将这些异常分为两大类:Error和Exception(都属于Throwable的子类)。

     Error:java中比较严重的错误,比如jvm内存溢出。一般不编写针对性的代码对其处理。

     Exception:java中非严重的异常,这些异常是可以编写代码进行处理的。其中Exception又分为运行时异常和编译时异常。

     运行时异常:在程序运行时被检测的异常,这种异常如果在调用的方法上被声明时,可以不用try{}catch{}处理,如果在方法内部用throw new 抛出该种异常时,可以不用在方法上用thorws关键字声明。

     编译时异常:编译时期被检测的异常,这种异常如果在方法上声明了,那么在调用该方法时必须try{}catch{}处理,否则编译失败。如果在方法内部用throw new 抛出该种异常时,必须在该方法上用throws关键字声明。

     java中异常处理格式:

          try{

                   需要被检测的代码;

                 }

        carch(异常类  变量){

                   处理异常的代码;

                  }

        finally{

                   一定被执行的代码;如释放资源等

                  }

代码及示例:

    异常处理过程:

public class ExceptionDemo {

	/**
	 * 异常
	 * @param args
	 */
	public static void main(String[] args) {
        try {
			int i=4/0;//出现异常后就被虚拟机检测到,直接转向catch代码块,其后面代码不会执行。
			System.out.println(i);
		} catch (Exception e) {//将捕获的异常传入
			System.out.println("出现除数为零!");
			e.printStackTrace();//调用异常类的方法。java中jvm的默认异常处理机制。
		}
	}

}

    异常处理方式:

public class ExceptionDemo {

	/**
	 * 异常
	 * @param args
	 */
	public static void main(String[] args)/*throws Exception*/ {
        try {
			int i=div(6, 0);//调用声明异常的方法。
			                //处理方式可try可抛,可以在调用该功能的方法上用throws关键字抛出
			System.out.println(i);
		} catch (Exception e) {
			System.out.println("出现除数为零!");
			e.printStackTrace();
		}
	}
	public static int div(int a,int b)throws Exception{//声明该方法存在异常
		return a/b;
	}

}

   多异常处理方式:
 

public class ExceptionDemo {

	/**
	 * 异常
	 * @param args
	 */
	//java中多异常的处理:
	//1.声明异常时,建议声明更具体的异常,这样处理可以更具体。
	//2.对调用的方法声明几个异常,就对应几个catch块,不要定义多余的catch块,如果多个catch块中的异常存在继承关系,那么父类的catch块放最下面。
	public static void main(String[] args){
		
        try {
			int i=div(4, 0);
			System.out.println(i);
		} catch (ArithmeticException e) {//编写针对性的catch块进行处理
			System.out.println("出现除数为零!");
			e.printStackTrace();
		}catch (ArrayIndexOutOfBoundsException e) {//编写针对性的catch块进行处理
			System.out.println("出现角标越界!");
			e.printStackTrace();
		}catch (Exception e) {//父类异常catch块放在最下面
			e.printStackTrace();
		}
	}
	public static int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException{//声明多个异常
		int[] arr=new int[a];
		System.out.println(arr[4]);
		return a/b;
	}

}

    自定义异常:

public class ExceptionDemo2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			div(4,-3);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	public static int div(int a,int b)throws NewException{
		if(b<0)
			throw new NewException("自定义异常");
		return a/b;
	}

}
public class NewException extends Exception{

	/**
	 * 自定义异常
	 * @param args
	 */
	//为什么自定义异常要继承Exception类?
	//因为异常体系都有一个特点:异常类和异常对象都可被抛出。这个可抛性是Throwable这个体系所独有的。只有这个体系中的类或对象才可以被throws和throw操作。
	public NewException(String message) {
        super(message);//调用父类的构造函数
	}

}

运行时异常:

public class RuntimeExceptionDemo {

	/**
	 * 运行时异常
	 * @param args
	 */
	//RuntimeException的特点:
	//1.在函数内抛出该异常,可以不用再函数上声明。
	//2.在函数上声明了该异常,在调用该函数时可以不进行异常处理(抛或try)
	public static void main(String[] args) {
       div(2, 2);//调用时并未做处理
	}
	public static int div(int a ,int b){//该方法上并没有throws关键字声明异常
		if(b==0)
			throw new RuntimeException("除数为零!");
		return a/b;
	}

}

  throws 和 throw的区别:

   1.throws用在函数上,throw用在函数内。

   2.thorws后面跟的是异常类,可以跟多个,用逗号隔开。而throw后面跟的是异常对象。

 

总结:

   在编写自定义异常时,应该注意该抛运行时异常或是编译时异常。如果某个功能在定义时可能存在异常,同时又不希望调用者在调用时由于手动处理而将问题隐藏掉,那么此时抛运行时异常,反之抛编译时异常。

 

 

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

 
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值