Concept
发现错误的理想时期是在试图运行程序之前。然而,编译期间并不能找出所有的错误,余下的问题必须在运行期间解决。这就需要错误源通过某种方式,把适当信息传递给某个接受者——该接受者知道如何正确处理这个问题。
throw
throw是语句抛出一个异常
语法:throws(异常对象)
throw e;
throws
throws是方法可能抛出异常的声明。(用于方法时,告诉调用方法的调用者,方法可能要抛出异常了 )
语法:[(修饰符)] (返回值类型) (方法名) ([参数列表]) [throws(异常类)]{…}
public void test() throws Exception1,Exception2,Exception3{...}
Example:
public class test {
public void func(int a) throws NumberFormatException, NullPointerException {
try {
if (a == 1) {
throw new IllegalAccessException();
} else if (a == 2) {
throw new NumberFormatException("continue to throw");
} else {
throw new NullPointerException("user-defined Exception");
}
} catch (IllegalAccessException e) {
System.out.println("会发生IllegalAccessException!!");
//catch到自己解决 就不用向外抛出 函数声明后面也不用写
} catch(NumberFormatException e) {
throw e;
//catch后继续抛出
}
}
函数声明后只需要写NumberFormatException NullPointerException,抛出后交给上层调用者解决,IllegalAccessException catch捕捉到自己解决 就不用写在函数后面
调用两次函数 参数先输入1后输入2
运行结果
会发生IllegalAccessException!!
Exception in thread "main" java.lang.NumberFormatException: continue to throw
at com.xxx.test.func(test.java:11)
at com.xxx.test.main(test.java:25)
遇到illegalAccessException后自己解决,继续执行。遇到NumberFormationException抛出异常
Difference
- throw在方法体内 throws在方法声明后面 由方法调用者来处理
- throw抛出一个异常实例 throws声明异常类型
- throws执行后一定会抛出具体异常 throws表示方法可能抛出
两者都不会由函数去处理异常,处理异常是有函数的上层调用
针对可能出现异常的方法针对性写一个throw是一个良好的编程习惯