Java-throw、throws和try-catch的区别

throw

throw 就是抛出一个异常,并且捕获这个异常的引用,这个异常会被抛出到外部的环境,由外部环境进行处理。

1
2
3
4
5
class A {
public void func() throws Exception {
throw new Exception
}
}

分析:

​ 这里抛出一个 Exception ,Exception 是 Throwable 的子类,是所有异常的基类。与此同时,Throwable还有另一个子类,Error。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class  ZeroTest {
public static void main(String[] args) {
try{
int i = 100/ 0;
System.out.print(i);
}catch(Exception e){
System.out.print(1);
throw new RuntimeException();
}finally{
System.out.print(2);
}
System.out.print(3);
}
}

分析:

​ try- catch 是直接处理,处理完成之后程序会继续往下执行,throw 则是将异常抛给它的上一级处理,程序便不往下执行了。程序中执行流程:出现异常,进入catch,打印1后抛出一个 RunTimeException ,缓存异常,执行finally ,打印2 ,最后程序中止。

throws

throws 并不是抛出一个异常,只是异常声明,表示这里可能出现异常,只是可能,所以可以没有,也可以有。这样的话,提高了程序的健壮性。但是,一个方法必然会出现异常的话,那么就会强制要求声明异常。

1
2
3
4
5
6
7
8
9
class A {
public void fun() throws Exception{
throw new Exception();
}

public void g() throws Exception {

}
}

try…catch

当我们在环境中调用fun() 和 g () 时,编译器会通知我们需要用一个try catch 程序块来处理这个异常。

这个程序块分两块,第一块是try{} 第二块是 catch(exception){}

try 中是可能出现异常的代码,而 catch 则是处理try 中抛出的异常,其中 catch 的参数列表接受的是一个异常的引用,是 throw 抛出来的异常对象的引用,我们以此获取异常对象,并对它进行操作。

1
2
3
4
5
6
7
8
9
10
11
public class Main{
public static void main(String[] args){
A a = new A();
try {
a.fun();
a.g();
} catch (Exception){
System.out.println("捕获了一个异常");
}
}
}

我们捕获了fun 的异常,因为我们明确的指明fun 会抛出一个异常 throw new Exception ();所以我们这里也会捕获到它,并去处理它。尽管g() 没有抛出任何的异常,编译器还是要求我们要用 try catch 把它括起来,是因为它拥有一个 throws 异常说明。

下面是常见的几种异常,供大家参考:

输入输出异常:IOException
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException

操作数据库异常:SQLException

文件未找到异常:FileNotFoundException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
字符串转换为数字异常:NumberFormatException
方法未找到异常:NoSuchMethodException