黑马程序员技术交流社区

标题: 【就业班】05-Exception异常 [打印本页]

作者: tianhaolin    时间: 2018-11-18 18:44
标题: 【就业班】05-Exception异常
1.异常体系
    1)ThrowAble类:是所有异常的超类,其子类有Error,Exception
    2)Exception:编译期异常,进行编译java程序出现问题
             RuntimeException:运行期异常,java程序运行过程中出现问题
    3)Error:错误
            *出现错误必须修改源代码,程序才能继续执行


2.异常的分类
    1)编译异常:Exception
            *处理的方法
                  throw:继续抛出,交给虚拟机处理
                  try...catch:抛出异常,后续代码继续运行
    2)运行异常
            *处理方法
                  try{可能出现异常的代码}catch(Exception e){异常的处理逻辑}
    3)错误:如内存溢出的错误
            *处理方法
                  必须修改源代码


3.异常产生原理
      *JVM检测到异常
          *JVM会根据异常产生的原因创建一个异常对象,这个异常对象包含了异常产生的(内容/原因/位置)
          *如果方法中没有异常的处理逻辑(try...catch),那么JVM就会把异常对象抛出给方法调用的对象处理
          *如果调用方法中没有异常处理逻辑(try...catch),继续向上抛出,直到抛出到JVM
          *JVM接收到了这个异常对象
             **把异常对象以红色字体打印到控制台
             **JVM会终止当前正在执行的java程序--->中断处理


  4.异常关键字
    1)throw:制造异常
          *格式:throw new 异常类名("异常原因字符")
          *注意事项:
             **throw关键字必须写在方法的内部
             **throw关键字后边new的对象必须是Exception或者其子类
             **throw关键字抛出制定的异常对象,我们就必须处理这个对象
                     throw关键字后面创建的是RuntimeException或者是其子类对象,我们可以不处理,默认交给JVM处理
                     throw关键字后面创建的是编译异常对象,我们就必须处理这个异常,必须用throws,或者try...catch
          *以后我们首先必须对方法传递过来的参数进行合法性校验
             如果参数不合法,那么我们就必须使用抛出异常的方式,告知方法的调用者,传递的参数有问题
          *Object非空判断
             Objects.requireNonNull(T obj)
    2)throws:声明异常
          *声明异常:异常处理的的第一种方法,交给调用者处理
          *格式:在方法声明时使用
             修饰符 返回值类型 方法名(参数列表) throws AAAException,BBBException{
                      throw new AAAException();
                      throw new AAAException();
                 }
          *注意:
              **throws关键字必须写在方法声明处
              **throws关键字后边声明的异常必须是Exception或其子类
              **方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常
                      如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可
              **调用了一个声明抛出异常的方法,我们就必须处理声明的异常
                      throws或try...catch
          *IO用到的一些异常类名
              **FileNotFoundException:文件找不到异常,是IOException的子类
              **IOExcption:只要是IO操作异常都属于该异常
    3)try...catch处理异常
          *try中可能会抛出多个异常,那么就可以使用多个catch来处理这些异常对象
          *如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续try...catch之后的代码
           如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码继续执行之后的代码
    4)finally
        *用法:try...catch...finally
               用finally代码块无论是否出现异常都会执行
        *注意:
              finally不能单独使用,必须和try一起使用
                  finally一般用于资源释放,无论程序是否出现异常,最后都要资源释放(IO);


5.捕获多个异常的3种方式
      *多次捕获多次处理
      *1个try多次catch  
             catch里面定义的异常变量,如果有父子关系,那么子类的异常变量必须写在边上,否则会报错
      *1个try一次catch
             catch()参数类型可以为多个异常的父类
      *使用场景:
             **代码实现一个同功能,可以使用1个try 1个catch
            **代码实现一个同功能,可以使用1个try 多个catch(Exception不同)
      *注意事项:
             **finally中最好不要写return
             **子父类的异常--子类:抛出和父类相同的异常
                                      抛出父类异常的子类
                                      不抛异常
                                                         
6.自定义异常类
        格式:
            public class XXXException extends RuntimeException/Exception{
                   //添加一个空参数的构造方法
                   public XXXException(){
                         super();
                   }
                   //添加一个带异常信息的构造方法
                   public XXXException(String message){
                         super(message);
                   }
                }
           
  分享一个思考的示例:通过try...catch异常实现用户输入错误则提示用户重新输入需查询数组的索引
[JavaScript] 纯文本查看 复制代码
public class Demo06TryCatch {

       public static void main(String[] args) {

        int[] arr2 = {0, 1, 2, 6, 9, 10};
        System.out.println("请输入索引:");
        int index = new Scanner(System.in).nextInt();

        //int element = getElement(arr2,index);
        int element = print(arr2, index);
        System.out.println(element);

        }

       private static int print(int arr[], int index) {
          Scanner scanner = new Scanner(System.in);
          int ele;
          try {
              ele = arr[index];
          } catch (Exception e) {
              System.out.println("重新输入索引");
              ele = print(arr, scanner.nextInt());
          }
          return ele;
       }
    }


   
        
   
        




        







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2