Java-throw、throws和try-catch的区别
throw
throw 就是抛出一个异常,并且捕获这个异常的引用,这个异常会被抛出到外部的环境,由外部环境进行处理。
1 | class A { |
分析:
这里抛出一个 Exception ,Exception 是 Throwable 的子类,是所有异常的基类。与此同时,Throwable还有另一个子类,Error。
1 | public class ZeroTest { |
分析:
try- catch 是直接处理,处理完成之后程序会继续往下执行,throw 则是将异常抛给它的上一级处理,程序便不往下执行了。程序中执行流程:出现异常,进入catch,打印1后抛出一个 RunTimeException ,缓存异常,执行finally ,打印2 ,最后程序中止。
throws
throws 并不是抛出一个异常,只是异常声明,表示这里可能出现异常,只是可能,所以可以没有,也可以有。这样的话,提高了程序的健壮性。但是,一个方法必然会出现异常的话,那么就会强制要求声明异常。
1 | class A { |
try…catch
当我们在环境中调用fun() 和 g () 时,编译器会通知我们需要用一个try catch 程序块来处理这个异常。
这个程序块分两块,第一块是try{} 第二块是 catch(exception){}
try 中是可能出现异常的代码,而 catch 则是处理try 中抛出的异常,其中 catch 的参数列表接受的是一个异常的引用,是 throw 抛出来的异常对象的引用,我们以此获取异常对象,并对它进行操作。
1 | public class Main{ |
我们捕获了fun 的异常,因为我们明确的指明fun 会抛出一个异常 throw new Exception ();所以我们这里也会捕获到它,并去处理它。尽管g() 没有抛出任何的异常,编译器还是要求我们要用 try catch 把它括起来,是因为它拥有一个 throws 异常说明。
下面是常见的几种异常,供大家参考:
输入输出异常:IOException
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
操作数据库异常:SQLException
文件未找到异常:FileNotFoundException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
字符串转换为数字异常:NumberFormatException
方法未找到异常:NoSuchMethodException