throw关键词
throw关键词用于方法体内部,用于抛出一个Throwable类型异常。如果抛出了检查异常,则还应该在头部声明方法可能抛出的异常类型。
该方法的调用者也必须检查处理抛出的异常。如果所有的方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常
消息和堆栈信息。如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。
throws关键词
throws关键词用于方法体外部的方法声明部分,用来声明方法可能会抛出的某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新
抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣般在catch块中打印堆栈信息来做处理。
下面我们来看几段代码:
代码一:
public static void main(String[] args){
try{
test();
}catch(Exception e){
e.printStackTrace();
}
}
static void test(){
try{
throw new Exception("test");
}catch(Exception e){
e.printStackTrace();
}
}
此段代码能正常运行,这是典型的捕获
代码二:
public static void main(String[] args){
try{
test();
}catch(Exception e){
e.printStackTrace();
}
}
static void test(){
throw new Exception("test");
}
改成这样将不能执行,虽然主函数里面的test()方法异常可以捕获,但是test()函数里面的异常抛出不能捕获代码三:
public static void main(String[] args){
try{
test();
}catch(Exception e){
e.printStackTrace();
}
}
static void test() throws Exception{
throw new Exception("test");
}
如果在上面代码的test()头部显示的抛出异常,程序可以正常编译通过代码四:
public static void main(String[] args){
try{
test();
}catch(IOException e){
e.printStackTrace();
}
}
static void test() throws Exception{
}
如果把test()函数体内的异常抛出去掉,把main函数里面的异常捕获改成IO异常程序又会出错,因为虽然程序并没有抛出异常,但是test()函数在声明时表示可能抛出一个Exception类型的异常,所以这里必须catch一个Exception类型的异常,即可以将IO异常捕获改成Exception异常捕获