Java异常往上抛 - throws抛出异常

阅读:312

目录介绍

  • 01.throws的用法介绍
  • 02.throw的用法介绍
  • 03.throws和throw区别
  • 04.Throws抛出异常的规则

01.throws的用法介绍

  • throws的具体使用规则
    • 用在方法声明后面,跟的是异常类名
    • 可以跟多个异常类名,用逗号隔开
    • 表示抛出异常,由该方法的调用者来处理
    • throws表示出现异常的一种可能性,并不一定会发生这些异常
    static void pop() throws NegativeArraySizeException {
    	// 定义方法并抛出NegativeArraySizeException异常
    	int[] arr = new int[-3]; // 创建数组
    }
    
    public static void main(String[] args) { // 主方法
    	try { // try语句处理异常信息
    		pop(); // 调用pop()方法
    	} catch (NegativeArraySizeException e) {
    		System.out.println("pop()方法抛出的异常");// 输出异常信息
    	}
    }
    
    使用throws关键字将异常抛给调用者后,如果调用者不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的调用者。
    pop方法没有处理异常NegativeArraySizeException,而是由main函数来处理。
    

02.throw的用法介绍

  • throw的一般形式如下所示
    throw ThrowableInstance
    

    • ThrowableInstance必须是Throwable或其子类类型的对象。throw语句之后的执行流程会立即停止,所有的后续语句都不会执行,然后按顺序依次检查所有的catch语句,检查是否和异常类型相匹配。如果没有找到匹配的catch语句,那么默认的异常处理程序会终止程序并输出堆栈踪迹。
    • 例如,运行以下代码,将得到输出结果:“NullPointerException”
      public class Demo {
      	public static void demo(){
      		throw new NullPointerException("NullPointer");
      	}
      
      	public static void main(String[] args) {
      		try{
      			demo();
      		}catch (NullPointerException e) {
      			System.out.println("NullPointerException");
      		}
      	}
      }
      

    • 但如果catch子句的异常与throw抛出的异常类型不匹配时,异常将由Java默认的异常处理程序来处理。例如,运行以下代码:
      public class Demo {
      	public static void demo(){
      		throw new NullPointerException("NullPointer");
      	}
      
      	public static void main(String[] args) {
      		try{
      			demo();
      		}catch (ArrayIndexOutOfBoundsException e) {
      			System.out.println("ArrayIndexOutOfBoundsException");
      		}
      	}
      }
      

      • 运行结果是:
      Exception in thread "main" java.lang.NullPointerException: NullPointer
      	at Demo.demo(Demo.java:4)
      	at Demo.main(Demo.java:9)
      

  • throw的具体使用方法
    • 用在方法体内,跟的是异常对象名
    • 只能抛出一个异常对象名
    • 表示抛出异常,由方法体内的语句处理
    public PlayService getPlayService() {
        PlayService playService = BaseAppHelper.get().getPlayService();
        if (playService == null) {
            //待解决:当长期处于后台,如何保活?避免service被杀死……
            throw new NullPointerException("play service is null");
        }
        return playService;
    }
    

03.throws和throw区别

  • throw的概述以及和throws的区别
    • throws的方式处理异常: 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上标识。
    • throw的概述: 在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。

04.Throws抛出异常的规则

  • Throws抛出异常的规则如下所示:
      1. 如果是不可查异常(unchecked exception),即Error、RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。
    • 2)必须声明方法可抛出的任何可查异常(checked exception)。即如果一个方法可能出现受可查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出,否则会导致编译错误
    • 3)仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣。
    • 4)调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。

赞赏支持


精彩留言

发表评论