黑马程序员技术交流社区

标题: 关于try和throw [打印本页]

作者: haio    时间: 2014-3-6 23:45
标题: 关于try和throw
本帖最后由 haio 于 2014-3-7 14:31 编辑

刚学异常时觉的还可以掌握可是到后面学习多线程时就不太清楚了
有没有同学总结一下:什么时候可throw可try;
                                  什么时候可try不可throw;
                                  什么时候可throw不可try;
先谢谢了!!!

作者: 欢欢    时间: 2014-3-7 08:22
本帖最后由 欢欢 于 2014-3-7 08:35 编辑

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

如果函数声明了异常,调用者需要进行处理。处理方式可throws可try。
注意:一般函数上不会抛RuntimeException,如果它在函数上抛出一个RuntimeException,这就是告
诉你,这个异常是可以处理的。你可不处理,也可以处理。

当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。

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

或者异常可以处理,但需要将异常产生后和本功能相关的问题提供出去,
让调用者知道,并处理。也可以将捕获到的异常处理后,转换新的异常。

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



作者: haio    时间: 2014-3-7 14:13
欢欢 发表于 2014-3-7 08:22
当函数内有throw抛出异常对象,并未进行try处理。必须要在函数上声明,否则编译失败。
注意,RuntimeExcept ...

谢谢分享!
作者: 水蓝    时间: 2014-3-13 00:06
感觉在初学JAVA的时候,throws和try的选择,对于学习写代码区别不是很大。
但是在软件设计过程中,throws和try的选择确是一定要搞清楚的。

首先,throws和try都是处理异常方按。
当遇到直接继承于Exception而非RuntimeException的异常时。
异常是必须处理的,处理的原则如下:
1、自己这一层代码,有责任处理的,必须catch住。
2、感觉没有责任处理的,可以继续向上层throw。但最好是先catch住,然后,重新new一个新的上层能看的懂的异常类型(这个就涉及自定义异常了)

当你遇见RuntimeException的子异常时,我遇到过两中情况:
1、为了告诉上层,调用的时候,入参本身就是错了。需要立刻停服修改代码。
比如:
  1. float div(float num1, float num2) {
  2.     return num1/num2:
  3. }
复制代码

如果入参是num1=1,num2=0,那肯定是入参前没有数据进行检查。
所以,这种异常要的不是捕获,而是修改代码。增加校验。

2、代码实现为了不要让异常污染接口。
这样封装的RuntimeException,哪一层负责捕获,哪一层去捕获。
JAVA编译器对于这种异常不会强制要求捕获。
比如:
定义一个接口用于获取数据:
  1. interface IDataSource{
  2.     String getData();
  3. }
复制代码

它的底层实现类可以是数据库、也可以是网络。
数据库和网络都有各自相关的异常,为了不污染接口,造成误解。
一般上抛的异常都封装为:RuntimeException的子类
作者: 残梦共飞雪    时间: 2014-3-13 22:09
本帖最后由 残梦共飞雪 于 2014-3-13 22:13 编辑

区别特性什么的就不用说了,以上同学说的都很好。

实际使用中,比如字符串转换字符集,会抛出一个异常,就是没有字符集错误异常。
但是实际使用中,比如一个方法叫strToUTF8,转换动作被封进方法,参数绝对正确,此时,
try{
//CODE
}catch(Exception e){
//TODO Nothing
}
当绝对不会发生某种异常时,catch掉。
当可以直接处理某些异常并且不影响运算时,catch后处理掉。
当影响运算时,throw交予上级。




一点个人经验。





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