黑马程序员技术交流社区

标题: 异常处理 [打印本页]

作者: 易杰    时间: 2013-4-21 11:16
标题: 异常处理
本帖最后由 易杰 于 2013-4-21 23:38 编辑

在声明方法一个时
方法体中的代码会有异常,这时异常是使用try/catch在方法体中捕获,还是声明方法时使用throws往外抛。。
为什么?
作者: 周音匀    时间: 2013-4-21 11:29
try.catch后面可以跟处理异常的代码,是由自己来处理,throw只是抛出异常,由调用方处理,也就是往上抛让更外面的catch处理,如果都没有代码处理,则整个程序异常,并运行结束
作者: 陈湘林    时间: 2013-4-21 11:31
一般都是throw外抛

作者: 王海龙2013    时间: 2013-4-21 11:49
抛出异常
在函数上通过throws声明异常,提高安全性,让调用者进行处理,否则编译失败。
调用者可继续抛出异常,或try处理问题。

声明异常时,要声明更为具体的异常,使处理可以更具体。
声明几个异常,就对应几个catch块,不要定义多余的catch块。多个catch块中异常若出现了继承
关系,父类异常catch块放在最下面。

  1.         int div(int a,int b)throws Exception//在函数上通过throws关键字声明该功能可能有问题,由调用者进行处理。
  2.                                                 //throws 异常1,异常2        :声明多个异常
  3.         {
  4.                 return a/b;
  5.         }
  6. }

  7. class ExceptionDemo
  8. {
  9.         public static void main(String[] args)//调用者throws Exception继续抛出问题或通过try处理问题
  10.         {
  11.                 Demo d = new Demo();
  12.                 //使用try格式处理问题
  13.                 try
  14.                 {
  15.                         int x = d.div(4,0);
  16.                         System.out.pritln("x="+x);
  17.                 }
  18.                 catch (Exception e)//Exception e = new ArithmeticException();
  19.                 {
  20.                         //多态,父类方法调用子类对象覆写
  21.                         System.out.pritln(e.toString());//对捕获异常对象调用方法处理
  22.                         System.out.pritln("除零了");       
  23.                 }
  24.                 //catch         (异常1){}分别具体处理声明的异常       
  25.                 //catch         (异常2){}
  26.                 System.out.pritln("over");
  27.                
  28.         }

  29. }
复制代码

作者: 陈雨    时间: 2013-4-21 11:54
分情况的,
1.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时也不可能抛出异常。这时只能try-catch处理。
2.当异常的发生是由操作者的操作失误引起时,希望问题发生时程序停掉后,对代码进行修正,这时就不声明出来,常见于RuntimeException及其子类。
3.其他的情况就是,你想将问题直接处理,就用try-catch;或者抛出来,函数内throw,函数上就必须throws声明出来
作者: 袁术森    时间: 2013-4-21 11:57
定义功能,功能内部因为传入的参数问题,导致了功能会出现问题。这时为了解决这个问题,通常,我们都会将问题通过throws声明在函数上。
目的:为了调用者在使用这个功能的时候,能明确
处理方式。也就是说throws抛出的目的是为了让调用者预先定义好问题的处理方式。
如果直接在方法体进行try cathch进行捕捉就不用在函数上进行声明了 大多都是声明往外抛给调用者,让调用者进行处理


作者: 先小涛    时间: 2013-4-21 12:16
总结是try还是抛:
1、必须try的情况是:继承的父类或者实现的接口的方法中没有异常抛出,那么子类在覆盖方法时也不能抛出异常。
2、一般定义父类或接口时,一般会预料到将要发生异常,却不能预料发生什么异常,此时会在函数上声明异常,即抛。如果预料到得异常是RuntimeException型的异常,那么也可以不抛。
3、在子类中实现父类或接口中声明过有异常的,则最好try。因为此时是具体实现,应该清楚会发生什么异常,所以最好try。当然也可抛,这样的话调用者就需要try了。
作者: up.yfei    时间: 2013-4-21 13:07
两种都可以啊,try{}catch{}是由自己来处理异常,如果是throws的话,就是自己现在不处理,交给调用方处理。
具体情况要看具体代码了,一般的话想立刻处理就try{}catch{}   不想立刻处理的就throws
作者: 黄玉昆    时间: 2013-4-21 21:56
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2