java基础之异常

Posted 暮尘时雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础之异常相关的知识,希望对你有一定的参考价值。

一、Throw(抛出异常,让调用者处理)

   Throw(将异常抛给调用者)
       在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?
       1. 创建一个异常对象。封装一些提示信息(信息可以自己编写)。
       2. 需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw 就可以完成。
       throw 异常对象。
       throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。

   public?class?ThrowDemo?{ ????
        public?static?void?main(String[]?args)?{ ????????
              //创建一个数组? ????????
              int[]?arr?=?{2,4,52,2}; ????????
              //根据索引找对应的元素? ????????
              int?index?=?4; ????????
              int?element?=?getElement(arr,?index); ? ????????
              System.out.println(element); ????????
              System.out.println("over"); 
        }?


       public?static?int?getElement(int[]?arr,int?index){? ??????? 
                    //判断??索引是否越界 ? ????????
              if(index<0?||?index>arr.length‐1){ ?????????????
            ???/* ?????????????
              判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。 ?????????????
              这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。? ??????????????
              */ ???????????
              throw?new?ArrayIndexOutOfBoundsException("哥们,角标越界了~~~"); ????????} ????????
              int?element?=?arr[index]; ????????
              return?element; ????
          } 
    }???

二、Throws(声明异常),,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).

  修饰符?返回值类型?方法名(参数)?throws?异常类名1,异常类名2…{???}

  

  public?class?ThrowsDemo?{ ????
        public?static?void?main(String[]?args)?throws?FileNotFoundException?{ ????????
              read("a.txt"); ????
        } ? ????

               // 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明           
       public static void read(String path) throws FileNotFoundException {         
           if (!path.equals("a.txt")) {
              //如果不是 a.txt这个文件              
              // 我假设  如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常  throw             
              throw new FileNotFoundException("文件不存在");         
              }     
        } 
   }

三、 捕获异常try…catch,捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。

  格式:
        try{ ?????
              编写可能会出现异常的代码 
        }catch(异常类型??e){ ?????
              处理异常的代码 ????
             //记录日志/打印异常信息/继续抛出异常
        }

  演示:
     public?class?TryCatchDemo?{ ????
              public?static?void?main(String[]?args)?{ ???????
                    try?{
                          //?当产生异常时,必须有处理方式。要么捕获,要么声明。 ????????????
                          read("b.txt"); ????????
                    }?catch?(FileNotFoundException?e)?{
                          //?括号中需要定义什么呢? ?????????? 
                          //try中抛出的是什么异常,在括号中就定义什么异常类型 ?? ????????????
                       System.out.println(e); ????????
                    } ????????
                    System.out.println("over"); ????
              } ?

        /** ?????
         *?我们?当前的这个方法中?有异常??有编译期异常 ?????
         */ ????
        public?static?void?read(String?path)?throws?FileNotFoundException?{ ????????
              if?(!path.equals("a.txt"))?{
                    //如果不是?a.txt这个文件? ????????????
                    //?我假设??如果不是?a.txt?认为?该文件不存在?是一个错误?也就是异常??throw ????????????        ??
           ?       throw?new?FileNotFoundException("文件不存在");
              }
      }
  } 

四、 ?nally 代码块:有一些特定的代码无论异常是否发生,都需要执行

?nally的语法: try...catch....?nally:自身需要处理异常,终还得关闭资源。

    ?
   public?class?TryCatchDemo4?{ ????
            public?static?void?main(String[]?args)?{ ????????
                try?{ ????????????
                    read("a.txt"); ???????
                }?catch?(FileNotFoundException?e)?{ ????????????
                    //抓取到的是编译期异常??抛出去的是运行期? ????????????
                    throw?new?RuntimeException(e); ????????
               }?finally?{ ????????????
                       System.out.println("不管程序怎样,这里都将会被执行。"); ????????
               } ????????
                 System.out.println("over"); ???
            } ????
     /* ?????
      * ?????
      *?我们?当前的这个方法中?有异常??有编译期异常 ?????
      */ ????
    public?static?void?read(String?path)?throws?FileNotFoundException?{ ????????
            if?(!path.equals("a.txt"))?{
                    //如果不是?a.txt这个文件? ???????????
                   //?我假设??如果不是?a.txt?认为?该文件不存在?是一个错误?也就是异常??throw ????????????              
                    ?throw?new?FileNotFoundException("文件不存在"); 
             }
      }
  }

五、异常注意事项

  多个异常使用捕获又该如何处理呢? 
        1. 多个异常分别处理。 
        2. 多个异常一次捕获,多次处理。 
        3. 多个异常一次捕获一次处理

  try{ ?????
        编写可能会出现异常的代码 
  }catch(异常类型A??e){??当try中出现A类型异常,就用该catch来捕获. ?????
        处理异常的代码 ?????
        //记录日志/打印异常信息/继续抛出异常 
  }catch(异常类型B??e){??当try中出现B类型异常,就用该catch来捕获. ?????
        处理异常的代码 ?????
        //记录日志/打印异常信息/继续抛出异常 
  }

六、自定义异常
原因:发现这些异常都是JDK内部定义好的,但是实际开发中也会出现很多异常,这些异常很可能在JDK中 没有定义过,例如年龄负数问题,考试成绩负数问题.那 么能不能自己定义异常呢?
异常类如何定义:
1. 自定义一个编译期异常: 自定义类 并继承于 java.lang.Exception 。
2. 自定义一个运行时期的异常类:自定义类 并继承于 java.lang.RuntimeException 。

   案例:
  
      //?业务逻辑异常 
        public?class?RegisterException?extends?Exception?{ ????
          /** ?????
           *?空参构造 ?????
           */ ????
             public?RegisterException()?{} ? ????
        
         /** ?????
          * ?????
          *?@param?message?表示异常提示 ?????
          */ ????
            public?RegisterException(String?message)?{ ????????
               super(message); ????
             } 
        }




以上是关于java基础之异常的主要内容,如果未能解决你的问题,请参考以下文章

JAVA基础之异常

Java基础之方法的调用重载以及简单的递归

java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.database.sqlite异常(代码片段

Java基础之异常

java基础之异常

Java 基础篇之异常