ai哟

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

异常处理:

    异常(Exception)是程序在执行过程中锁产生的问题;

  异常分类:

    问题:1)异常(Exception):(1 运行时异常(未检查异常):表现形式出现;

                   (2 编译异常(检查异常):(Unhandled exception:编译异常)是在编译期调用某个方法有可能抛出某个或几个异常,需要处理,否则编译不通过;

       2)错误(Error):程序员不能用代码处理的问题,常是硬件、环境、系统问题;

  异常的控制流程:

    在java中,异常(Exception)是被一个方法抛出的对象,当一个方法抛出异常时,该方法从调用栈中被弹出,同时产生的异常对象抛给栈中的前一个方法;

    对于异常处理,方法有3种:

     1、捕获异常,不让它沿着调用栈继续向下抛出;

     2、捕获异常,并继续向下抛出;

     3、不捕获这个异常,从而导致方法调用栈中被弹出,异常对象i继续抛给调用栈下面的方法;

  异常分类:Throwable类:

      1)Error→AssertionError

      2)Exception→IOException

             →RuntimeException→lllegalArgumentException→NumberFormatException

                        →ArithmeticException

                        →NullPointerException

  异常处理:1)预判,提前消除异常出现的条件;

       2)异常捕获:try-catch-finally

 

public class ClassC {
    
    public void methodC(){
        System.out.println("methodC begin......");
        while(true){
            try{
                System.out.println("请输入一个正整数:");
                int    input = new Scanner(System.in).nextInt();
                int result = 100 / input;
                System.out.println("result = " + result);
                break;
            }catch(ArithmeticException ae){                // (ArithmeticException ae)——括号内输入异常引用
                System.out.println("不能输入0!");             // 语句块:异常提示语句;
            }catch(InputMismatchException ime){
                System.out.println("只能输入整数!");
            }catch(Exception ex){                      // 如果捕获异常与继承关系;父类异常写在后面,子类异常写在前面
                ex.printStackTrace();                   // 打印出异常(开发是引用,软件发布后删除)
            }finally{                            //  不管被保护代码发生什么异常,都必须实行的异常;
                System.out.println("methodC end......");
            }
         }
    }
}

    写在最后catch块后面,放在finally当中的都是资源的清理,通道的关闭动作;finally:不管break、continue还是return都无法阻止finally被执行,finally在他们之前先被执行;

    语法上:try—catch—finally  都不能单独存在;

        try后面必须接catch或finally;

        try后面:catch或finally两者可同时存在或存在其中一个;

        catch或finally前面必须写try;

        //针对一道特有面试题
	public int methodAA(){
		int result = 0;
		try{
			result = 5;
			return result;
		}catch(Exception ex){
			result = 6;
		}finally{
			result = 7;
		}	
		return 0;
	}    

最后操作台输出:result = 5;(因为result = 5 预先存入数据段中, finally再被执行result=7,  最后打印result调出赋值是预先存入的5,所以打印出result = 5 )

  捕获异常:

    Try程序块里面的语句是按顺序执行的语句;

    当try程序块里面的语句抛出一个异常的时候,程序的控制专项了匹配的catch程序块,catch程序块里面的语句被执行;

    当异常发生后,程序执行将忽略try程序块中剩余的语句,继续执行程序块后面的语句;

    如果在try程序块中没有抛出异常,那么catch块将被忽略没程序将继续执行try-catch下面的语句;

 

  使用Thows关键字抛出异常对象:

    一个完整的方法申明:访问修饰符  可选修饰符 返回类型 方法名(形参列表)throws 抛出的异常列表;throws还会影响到重写的规范---子类重写方法不能抛出比父类被重写方法更多的异常。(这里的更多不是指异常类型的个数,而是异常类型的范围。)
    当主动抛出的是一个编译时异常的时候,必须要在编译期对本方法的调用者提出警告,所以在方法的申明部分,应该有throws内容,表明本方法有可能发生异常。

public class AClass {

	public void bMethod() throws Exception{
		int choice = new Scanner(System.in).nextInt();
		if(choice > 5){
			throw new Exception();
		}
	}
}

  

   throw 和 throws的辨析:
    1、throw和throws都是关键字,都是属于异常处理部分的;
    2、throw是写在方法体当中的,后面跟的是一个异常对象;
        throws是写在方法的申明的最后的,后面跟的是一个或多个异常类
    3、当运行到throw这句代码的时候,就会真正发生抛出一个异常对象的动作;
         throws是在编译期警告本方法的调用者,有可能会发生哪些类型的异常。
    4、当一个方法体当中有throw语句,不一定会有throws,除非throw后面
       跟的是编译时异常,那就必须写throws。

    所有抛出异常必须在main方法之前处理,不然抛到main方法时就就到虚拟机中执行;

  自定义异常:

    三层结构:表示层、业务层、数据访问层(持久层)

  

//1、自定义异常一定要继承Exception
public class LovoException extends Exception{
	
	public LovoException(){
		
	}
	
	//2、自定义异常至少要有两个带参构造;
	//   一个带异常参,一个带字符串参。
	//   前者用于把其它异常类型转换为自定义异常
	//   后者用于操作非JVM主动抛出的业务异常(比如:工资为负)
	public LovoException(Exception ex){
		super(ex);
	}
	
	public LovoException(Throwable th){
		super(th);
	}
	
	public LovoException(String msg){
		super(msg);
	}
	
	//3、可以给自定义异常提供扩展方法
	public void writeLog(){
		System.out.println("打印日誌");
	}
	
}

  

 

posted on 2016-12-10 20:10  ai哟  阅读(291)  评论(0编辑  收藏  举报