探讨throw、throws 、trycatch 作用区别

xiaoxiao2021-02-28  118

在学习java异常处理的时候,总是被这几个关键字搞的晕头转向,爬到网上找了些帖子和例子,好好理解一下他们的作用与区别:

关键字:throw  throw是一种控制程序流程的特殊方法而已。没有相应的catch的话,可以中止当前的方法继续执行。

关键字:throws  声明方法时候,如果不声明throws的话,那么一般的Exception都要在这个方法中终结,也就是说一定要有相应的catch处理,否则编译时会产生错误。如果方法声明了throws的话,可以交给上一级方法去处理。以此类推。但是有些Exception可以不加捕捉,编译也会通过。继承Exception类,可以自己定义Exception,对于特定的状态,用throw抛出专用的例外。这对于特定的middle ware开发,有一定帮助。

关键字:try、catch  用个形象的比喻,如果说throws相当于职业介绍中介的话,那try和catch就是一对倒霉的打工仔。很有意思,throws只是告诉编译器--方法可能产生的异常问题,然后把问题处理抛给try和catch。他们一个负责发现异常关系,一个负责异常捕获。很辛苦的一对难兄难弟哦,:)

下面是一个不正确的例子。该例试图引发一个它不能捕获的异常。因为程序没有指定一个throws子句来声明这一事实,程序将不会编译。

Java代码   // This program contains an error and will not compile.    class ThrowsDemo {    static void throwOne() {    System.out.println("Inside throwOne.");    throw new IllegalAccessException("demo");    }    public static void main(String args[]) {    throwOne();    }    }  

 

为编译该程序,需要改变两个地方。第一,需要声明throwOne( )引发IllegalAccessException异常。第二,main( )必须定义一个try/catch语句来捕获该异常。

正确的例子如下:

Java代码   // This is now correct.    class ThrowsDemo {    static void throwOne() throws IllegalAccessException {    System.out.println("Inside throwOne.");    throw new IllegalAccessException("demo");    }    public static void main(String args[]) {    try {    throwOne();    catch (IllegalAccessException e) {    System.out.println("Caught " + e);    }    }    }  

 

下面是例题的输出结果:

inside throwOne

caught java.lang.IllegalAccessException: demo 

区别一:throw 是语句抛出一个异常;throws 是方法抛出一个异常; throw语法:throw <异常对象> 在方法声明中,添加throws子句表示该方法将抛出异常。如果一个方法会有异常,但你并不想处理这个异常,就在方法名后面用throws,这样这个异常就会抛出,谁调用了这个方法谁就要处理这个异常,或者继续抛出. throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>] 其中:异常类可以声明多个,用逗号分割。 区别二:throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。 联系一:try .... catch 就是用catch 捕获 try 中的异常,并处理;catch是捕获异常。也就是说某一个操作有可能会抛出什么异常。throw 就是不处理异常,直接抛出异常   调用一个会throws exception的方法(在方法定义的时候可以用throws实现)时,需要把这个方法放在try里,然后用catch破获这个exception,做相应的处理。 throw new exception()是抛出一个exception,由别的method来破获它。   也就是说try....catch是为破获别人的exception用的,而throw是自己抛出exception让别人去破获的。   public void input() throws Exception { } public void outputException() {    try {        input(); } catch(Exception e) { System.out.println("Exception"); } }   简单的说,如果一个方法中用了throws,那么这个方法会向上抛出一个异常,那么在调用这个方法的时候必须把这个调用放在try...catch块里处理这个异常。   对于异常有两种处理方法 1、要么声明异常,也就是在方法名后面加上throws exceptionname,..., 方法本身只是抛出异常,由函数调用者来捕获异常。 若产生异常,异常会沿着调用栈下移,一直找到与之匹配的处理方法,若到达调用栈底仍未找到,程序终止。 2、要么捕获异常。通过try catch方法,catch子句中放置处理异常的语句。   联系二:对于会觉得会有异常抛出的程序块,用try{}包住,然后用catch来抓住这个异常,在catch中对异常做处理, 在try中如果有异常的话,程序会转到catch而不会中断,通常这两个是配合使用的,如果你不想因为程序有错,而抛出一大堆异常的话,你就把该程序try起来,try和catch只能获取程序运行时引发的异常,而throw语句可以引发明确的异常,程序到了throw语句这后就立即停止,不会执行后面的程序,

转载请注明原文地址: https://www.6miu.com/read-38566.html

最新回复(0)