java怎么抛出异常:两种关键字实操写法
java怎么抛出异常分为两种写法,throw用于方法体内主动抛出异常实例,throws写在方法声明处向上传递异常;受查异常必须搭配throws声明或者try-catch捕获,运行时异常仅用throw即可,不需要额外声明,仅在自定义业务报错、参数校验场景用throw主动抛出,底层IO、网络调用等原生异常优先用throws向上抛给调用层处理;如果是JDK8及以上版本,多异常声明可以用逗号分隔,不要把throw写在方法声明位置,也不能抛出非Throwable子类的普通对象。
throw主动抛出异常
你把代码写在方法内部,先new异常对象,再用throw抛出,抛出后后续代码不会执行。
示例代码:if(num<0){thrownewIllegalArgumentException("数值不能为负数");}
如果抛出的是IOException这类受查异常,必须在方法头加上throws声明;如果是NullPointerException这类运行时异常,不用额外声明,JVM会自动接收异常。
throws向上声明抛出异常
throws写在方法参数括号之后,用来告诉调用者,当前方法可能产生某类异常,自身不做捕获处理,直接把异常向上传递。
单个异常写法:publicvoidreadFile()throwsIOException;多个异常用逗号隔开:throwsIOException,FileNotFoundException。
调用带有throws声明的方法时,要么用try-catch捕获异常,要么继续在当前方法上加throws继续向上抛出,一直抛到main方法。
throw与throws核心区别对比
| 对比项 | throw | throws |
|---|---|---|
| 书写位置 | 方法体内部 | 方法声明头部 |
| 作用对象 | 抛出单个异常实例对象 | 声明多个异常类型 |
| 使用场景 | 参数校验、自定义业务报错 | 原生IO、网络异常向上传递 |
| 语法数量 | 一次只能抛出一个异常 | 可以同时声明多种异常 |
边界限制与注意事项
受查异常必须被处理,这是Java语言规范里的强制要求,不能只写throw而不做捕获或声明,否则编译器直接报错。
你不能在finally代码块里使用throw抛出受查异常,容易造成异常覆盖,多数业务开发场景都会规避这种写法。
不要在条件永远为false的代码块里写throw语句,编译器会判定代码无法到达,直接编译失败。
完整可直接运行的代码示例
publicclassTestException{publicstaticvoidcheckAge(intage)throwsException{if(age<18){thrownewException("年龄未满18岁");}}publicstaticvoidmain(String[]args){try{checkAge(16);}catch(Exceptione){System.out.println(e.getMessage());}}}
这段代码同时用到throw抛出异常和throws声明异常,调用方用try-catch完成捕获,符合Java异常抛出的标准写法。
