JavaSE中级之Java异常

Java异常

Exception:在程序的运行过程中,发生了不正常的现象,阻止了程序的运行,这就叫发生异常

用if - else 处理异常

缺点

  • 代码臃肿,业务代码和处理异常代码混淆在一起
  • 可读性差
  • 需要花费大量时间和精力维护漏洞
  • 很难堵住所有漏洞

try - catch 捕获异常

  • 出现了异常先看异常代码的第一行,然后再看异常代码的最后一行
  • 异常代码第一行一般是提示异常的类型,异常代码的最后一行一般是提示出现异常的位置

捕获异常

  • 把可能出现异常的代码放到try - catch里面

     try {
                Scanner sc = new Scanner(System.in);
                System.out.println("输入:");
                int num = sc.nextInt();
                System.out.println(num);
            }catch (Exception exception){
                System.out.println("出错!");
            }
    

原理

  • 把可能出现异常的代码放到try - catch代码块里面,然后把异常封装成对象,被catch (Exception exception)中的Exception异常对象接收;然后执行catch{}里面的代码,try - catch后面的代码照常执行
  • 如果没有异常catch中的代码就不会执行
  • 如果发生异常,catch异常类型和报错的异常类匹配就执行catch里面的代码;如果不匹配就捕获异常失败,继续报错
  • try中出现异常被catch捕获成功后,try中后续的代码不会执行

catch处理异常的方式

  • catch里面啥都不写

    catch (Exception exception){
               
            }
    
  • catch里面提示异常,自定义异常信息

    catch (Exception exception){
                System.out.println("出错!");
            }
    
  • catch里面打印异常信息

    catch (Exception exception){
                System.out.println(exception.toString());
            }
    
  • 显示异常描述信息

    catch (Exception exception){
                System.out.println(exception.getMessage());
            }
    
  • 显示异常详细信息

    catch (Exception exception){
               exception.printStackTrace();
            }
    
  • 抛出异常,后面的代码不执行

    catch (Exception exception){
               throw exception;
            }
    

finally修饰异常

  • 将必须执行的代码放入finally中,这个代码就必定会执行
  • 先执行finally,最后再执行return
  • 关闭数据库资源,关闭IO流资源,关闭socket资源的代码都需要放到finally中
  • System.exit(0)直接终止虚拟机,finally中的代码永远都不会执行

异常——多重catch

  • try中出现异常之后,将异常类型和catch后面的类型一次比较,按照代码的顺序进行比较时,执行第一个和异常类型相匹配的catch语句
  • 一旦执行其中一条catch语句之后,后面的catch语句就会被忽略
  • 在写catch语句的顺序的时候,一般会将特殊异常放在前面,普通异常放在后面
    • 先写子类异常再写父类异常
  • JDK1.7之后异常的新的处理方式
    • 可以用 | 符号进行连接

异常的分类与层次结构

运行时异常

  • 不用特意对异常进行处理,程序运行后,系统会自动检测然后抛出异常

  • NullPointerException :空指针异常

     int Arr[] = null;
            System.out.println(Arr.length);
    
  • ArrayIndexOutOfBoundsException : 下标越界异常

     int Arr1[] = {1,2,3,4,5};
            System.out.println(Arr1[7]);
    

检测时异常

  • 未雨绸缪,防患于未然

  • 在编辑代码的时候就需要对代码进行异常处理

  • try - catch 解决异常示例

    • ClassNotFoundException
    //异常代码
    Class.forName("java5.Cat");
    //处理后的代码
     try {
                Class.forName("java5.Cat");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    //处理后的代码2
     public static void main(String[] args) throws ClassNotFoundException {
            Class.forName("java5.Cat");
        }
    
    • InstantiationException、IllegalAccessException

       //异常代码
      try {
                  Class.forName("java5.Cat").newInstance();
              } catch (ClassNotFoundException e) {
                  e.printStackTrace();
              }
      //处理后的代码1
       try {
                  try {
                      Class.forName("java5.Cat").newInstance();
                  } catch (InstantiationException e) {
                      e.printStackTrace();
                  } catch (IllegalAccessException e) {
                      e.printStackTrace();
                  }
              } catch (ClassNotFoundException e) {
                  e.printStackTrace();
              }
      //处理后的代码2
      try {
                  Class.forName("java5.Cat").newInstance();
              } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
                  e.printStackTrace();
              }
      //处理后的代码3
      public static void main(String[] args) throws InstantiationException, IllegalAccessException {
            
                  Class.forName("java5.Cat").newInstance();
             
          }
      

throw和throws的区别

位置不同
  • throw写在方法的内部
  • throws写在方法的声明处
内容不同
  • throw后面接的是异常对象(检查异常,运行时异常)
  • throws后接的是异常的类型,可以多个类型用逗号拼接
作用不同
  • throw相当于异常出现的源头,制造异常
  • throws是在方法的声明处,告诉方法的调用者,这个方法中可能会出现自己声明的异常,然后调用者对这个异常进行处理
    • 自己处理或者继续向上抛出异常

自定义异常

  • 如果继承的是运行时的异常,在使用的时候无需额外处理
  • 如果继承的是检查异常,在使用的时候需要try - catch 捕获异常或者throws向上抛出异常
posted @ 2022-10-17 09:32  理想还很年轻  阅读(36)  评论(0)    收藏  举报