探讨throw、throws 、try/catch 作用区别

来源:互联网 发布:中国的动漫公司知乎 编辑:程序博客网 时间:2024/06/05 10:48

在学习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代码  收藏代码
  1. // This program contains an error and will not compile.  
  2.   
  3. class ThrowsDemo {  
  4.   
  5. static void throwOne() {  
  6.   
  7. System.out.println("Inside throwOne.");  
  8.   
  9. throw new IllegalAccessException("demo");  
  10.   
  11. }  
  12.   
  13. public static void main(String args[]) {  
  14.   
  15. throwOne();  
  16.   
  17. }  
  18.   
  19. }  

 

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

正确的例子如下:

Java代码  收藏代码
  1. // This is now correct.  
  2.   
  3. class ThrowsDemo {  
  4.   
  5. static void throwOne() throws IllegalAccessException {  
  6.   
  7. System.out.println("Inside throwOne.");  
  8.   
  9. throw new IllegalAccessException("demo");  
  10.   
  11. }  
  12.   
  13. public static void main(String args[]) {  
  14.   
  15. try {  
  16.   
  17. throwOne();  
  18.   
  19. catch (IllegalAccessException e) {  
  20.   
  21. System.out.println("Caught " + e);  
  22.   
  23. }  
  24.   
  25. }  
  26.   
  27. }  

 

下面是例题的输出结果:

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语句这后就立即停止,不会执行后面的程序,

原创粉丝点击