异常处理的设计和重构学习二

【一】

Exception异常--->意思是例外。
一:异常处理机制代码和程序源代码放一块坏处1)-->逻辑代码和错误处理代码放在一起,降低程序的可读性
                                                                     2)--->程序员在编写程序时考虑的例外情况多,对程序员本身要求高
二:异常机制-->当程序出现错误,程序如何安全退出的机制。
                                java的异常机制就是JDK中以Throwable类为父类所有可能出现的意外情况
三:java中采用面向对象的方式来处理异常---过程--->1)抛出异常:执行代码,发生异常,产生代表该异常的对象,并停止当前代码,并把异常交予jre处理(jvm)
                                                                         ------->2)捕获异常:jre得到异常后,寻找相应代码处理。
四:异常分类
       
                      --->Error(UnCheckedException)java运行系统内部错误或资源耗尽。例如Jvm崩溃,断电。程序员不能处理
Throwable《                        
                     --->Exception--->1)RuntimeException(UnCheckedException)编译时不报错,运行时报错。例:除数为0
                                                                                       
                                             
                                            --->2)非RuntimeException(CheckedException)编译时报错,★[需要运用异常机制处理异常]
运行时异常(Run异常处理机制代码和程序源代码放一块坏处1)-->逻辑代码和错误处理代码放在一起,降低程序的可读性timeException)[UnCheckedException]--->程序员自己逻辑出现错误,可以通过修改代码处理异常。强制停止程序运行,便于程序员修改,增强程序【安全性】
非运行时异常,编译异常[CheckedException]--->需要通过异常机制去处理的异常,增强代码的【健壮性】
处理异常和有用代码放在一起的坏处
1逻辑混乱
2对程序员自身要求高
java处理异常的方法
1:抛出异常。
2:捕获异常。

【二】

第一种办法:抛出异常,捕获异常(try catch)
【格式】
try{
     //可能产生异常的源代码
    }catch(Exception e){
                       //处理异常方法
                       }finally{
                                       //释放资源                
                               }
语法特点1)一个try语句必须至少带有一个catch{}或finally{}块
            2)catch(对象)如果存在多个catch,那么对象从上往下的对象 ---> 【 小(子类)在上,大(父类)在下 】
            3 ) 一个try语句可以产生多个catch,一个catch语句只能捕获一个异常对象
            4)catch块中的常用方法 --->a)  toString()-->显示异常类的类名和产生异常的原因
                                               ---->b)  GetMessage()-->只显示产生异常的原因,不显示异常类名
                                               ---->c)  printStackTrace()-->显示异常类类名,产生异常原因,打印栈堆信息(常用)

【三】

第二种办法:自动抛出异常--->throws子句
格式:
方法名+ throws 异常类 (){
               //可能出现异常的源代码
}
自动抛出异常的特点--->1)当编译时异常( CheckedExcption )出现时,不一定处理它,可以把异常向上抛出,让调用它的方法处理。可以不断向上抛出,在main方法中处理,即程序运行时处理。
                               --->2)如果一个方法体内抛出多个异常,那么异常类在方法名后用【,】隔开
方法重写中声明异常的原则(1)-->父类方法没有声明异常,子类重写方法不能声明异常
                                       (2)-->重写方法抛出的异常类,与被重写方法抛出的异常类关系。子类<=父类 (继承父子)
                                         (3)--->子类抛出异常类的数目,不可多余父类抛出异常类的数目 (不是指个数,指的是类型)

【四】

手动抛出异常类throw
步骤:1)找一个合适的异常类
          2)创建该类的对象
          3)将对象手动抛出
          4)throw后的代码不执行。
例子--->在方法体内抛出异常。throw
public static int sum( int a, int b) {
                if(b==0){
                       throw new MyzeioException();
               } else {
                        int sum=0;
                       sum=a/b;
                        return sum;
               }
例子--->
public static void main(String[] args ) {
                sdf ();
               System. err .println( "sxf" ); // 不运行
       }
   
    public static void sdf(){
           System. out .println( "PaymentRequestServiceImpl.sdf()" ); // 运行
            int a =1/0;
           System. err .println( "tt" ); // 不运行
   }
例子--->
  public static void main(String[] args ) {
                try {
                        sdf ();
               } catch (Exception e ) {
                        // TODO Auto-generated catch block
                        e .printStackTrace();
               }
               System. out .println( "PaymentRequestServiceImpl.main(sxf)" ); // 运行
       }
   
    public static void sdf() throws Exception{
           System. out .println( "PaymentRequestServiceImpl.sdf()" ); // 运行
            if ( true ){
                    throw new Exception();
           } else {
                   System. out .println( "PaymentRequestServiceImpl.sdf(dddd)" ); // 不运行
           }
            System. out .println( "PaymentRequestServiceImpl.sdf(stttt)" ) ; // 不运行
   }
  

【五】

第四种办法:--->自定义异常类
什么时候自定义异常类--->当jdk中的异常机制里的异常类 不能满足程序员编写代码可能产生的异常时 ,需自建异常类
* 第四种实现方法   自定义异常
         * 当系统提供 Exception 不能满足 我们自身
         * 个性话的 需要的时候
         * 1 、创建一个异常的子类
         * 2 、创建两个构造器
         * 3 、有参数的构造器可以借助
         *     super( 参数 ) 去调用父类中的
         *     含有参数参数的构造器  
1、一般情况下 继承Exception或下面的子类(除了RuntimeException)  ---》在编译时候 需要处理  MyCheckException (大多数自定义异常类继承Exception)
2、继承RuntimeException类  =======》在运行时候处理  RuntimeException (少之又少)
例子:
//自定义的异常类
public class MyzeioException extends Exception {
        public MyzeioException (){}
       
        public MyzeioException(String str){
                super (str);
       }
}
// 测试类
public class Test{
       public static void main(String args){
               try{
                       sum(2,0);
                 }catch(MyzeioException e){
                       e.printStackTack();
               }
}
public static int sum( int a, int b) throws MyzeioException {
                if (b==0){
                        throw new MyzeioException();
               } else {
                        int sum=0;
                       sum=a/b;
                        return sum;
               }
}

原文地址:https://www.cnblogs.com/shangxiaofei/p/4855833.html