A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© student 中级黑马   /  2013-5-24 09:30  /  5392 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 student 于 2013-5-26 16:23 编辑

在异常处理中,有的时候抛出异常,有的时候却捕获异常,我有点不明白。
到底什么时候抛出异常?什么时候 try{ }catch{ }异常呢?


评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

8 个回复

倒序浏览
稍微解释一下
看该异常是否能被自行处理,如果能处理,则需要用try{}catch{},自己捕捉,自己处理。
如果该异常不能自己处理,则需要往外抛,让调用者来处理该异常
如果调用者还不能处理,继续往外抛,最后要某被处理,要么抛到JVM.
回复 使用道具 举报
分情况
       1,如果你当前异样发生,程序的目的还可以通过catch里的内容达成,那就捕获,如果发生异常了再运行程序也是达不到预想要求了,就抛出,
       2,当子类继承父类时,如果子类发生异常的函数有覆盖父类,那么你就要看父类的那个函数有没有抛出异常,如果父类抛出了,你可以选择捕获或者抛出,当时抛出的异常必须为父类抛出异常的子类,如果父类没有抛出异常,那么子类那个就不管什么情况只能捕获,如果抛出就会编译出错

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
1.首先抛出了要么继续抛,要么就得catch处理。
2.什么时候抛?如果用的是java提供的方法那么查询API即可,如果是自己封装的方法那么就看你自己如何定义的异常了。会出现异常的地方要么就直接catch处理,要么继续抛。
3.什么时候try catch。抛出之后都可以try catch。非得try catch的时候那就是没得抛的时候就得try catch了啊。
编译时被检测异常
  该异常在编译时,如果没有处理(没抛也没try),编译失败
  该异常被标识,代表可以被处理。
运行时异常(编译时不检测)
  在编译时,不需要处理,编译器不检查。
  该异常的发生,建议不处理,让程序停止,需要对代码进行修正。

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
1.一般不提倡直接抛出异常,能处理的尽量用try{}catch{}处理掉。
2.当确实不需要或者无法处理相应的异常可以直接抛出采用例如throws Exception。
3.视频中老师所使用的throws Exception,是为了简化代码,所以尽量不要使用直接抛出异常。

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
王靖远 发表于 2013-5-24 17:46
1.首先抛出了要么继续抛,要么就得catch处理。
2.什么时候抛?如果用的是java提供的方法那么查询API即可, ...

说得很详细,非常感谢!
回复 使用道具 举报
当在可能会出现exception的地方,要使用try-catch或者throws或者两者都要。
我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-catch掉这个exception;如果希望外部知道,则在catch到之后把exception直接抛出或者抛出自定义的exception。
另外,有些地方即使不会有exception,但是从商业逻辑上是错误的、非预期的,也可以抛出user exception。例如,用户输入非法,bank account(非法透支) 等等。
回复 使用道具 举报
First 中级黑马 2013-5-25 00:25:36
8#
毕老师在第10-5视频有很详细的总结。
/*
异常:
是什么? 是对问题的描述,将问题进行对象的封装。
-------------
异常体系:
        Throwable
                |--Error
                |--Exception
                        |--RuntimeException
异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。
                                 也就是说可以被throw和throws关键字所操作。
                                 只有异常体系具备这个特点。
---------------
throw 和 throws 的用法:

throw定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开。


当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,都在编译失败。
注意:RuntimeException除外。 也就是说,函数内如果抛出的RuntimeException异常,
函数上可以不声明。
-----------------------


如果函数声明了异常,调用者需要进行处理。处理方法可以是throws可以是try。

异常有两种:
        编译时被检测的异常
                该异常在编译时,如果没有处理(没有抛也没有try),编译失败。
                该异常被标识,代表可以被处理。
        运行时异常(编译时不检测)
                在编译时不需要处理,编译器不检查。
                该异常的发生,建议不处理,让程序停止。需要对代码进行修正。

----------------


异常处理语句:
try{
        需要被检测的代码;
}
catch(){
        处理异常的代码;
}
finally{
        一定会执行的代码;
}

有三个结合式:
try
catch

try
finally

try
catch
finally

注意:
1.finally中定义的通常是 关闭资源代码 因为资源必须释放
2.finally只有一种情况不执行, 当执行到 System.exit(0);//系统退出,jvm 结束。

----------------------------


自定义异常:
        定义类继承Exception或者RuntimeException
        1.为了让该自定义类具有可抛性。
        2.让该类具备操作异常的共性方法。

        当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
        异常信息传递给父类的构造方法。

        class MyException(String msg){
                MyException(String msg){
                        super(msg);
                }
        }

自定义异常,按照java的面向对象思想,将程序中出现的特有问题进行封装。
--------------------------

异常的好处:
        1.将问题进行封装。
        2.将正常流程的代码和问题处理的代码相分离,方便阅读。

异常的处理原则:
        1.处理方式有两种,try或者throws。
        2.调用到抛出异常的功能时,抛出几个,就处理几个。
          一个try对于多个catch。
        3.多个catch,父类的catch放到最下面。
        4.catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,
          输出语句也不要不写。
          当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。

          try {
                  throw new AException();
          }catch(AException e){
                  throw e;
          }

          如果该异常处理不了,但并不属于该功能出现的异常。
          可以将异常转换后,在抛出和该功能相关的异常。

          或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,
          当调用者知道,并处理。也可以将捕获异常处理后,转换新的异常。
          try{
                  throw new AException();
          }catch (AException e){
                  //对AException处理
                  throw new BException;
          }

          比如,汇款的例子。


异常的注意事项:
        在子父类覆盖是:
        1.子类抛出的异常必须是父类的异常的子类或者子集。
        2.如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。

*/
回复 使用道具 举报
杨青 中级黑马 2013-5-25 11:36:44
9#
原则上就是:能自己处理就自己处理,不能处理就抛出,如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-catch掉这个exception;如果希望外部知道,则在catch到之后把exception直接抛出或者抛出自定义的exception。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马