catchtry catch 不抛出异常的范围太大怎么弄

Java中异常的捕获顺序(多个catch)
import&java.io.IOE
public&class&ExceptionTryCatchTest&{
&&&&public&void&doSomething()&throws&IOException{
&&&&&&&&System.out.println("do&somthing");
&&&&public&static&void&main(String[]&args){
&&&&&&&&ExceptionTryCatchTest&et&=&new&ExceptionTryCatchTest();
&&&&&&&&try&{
&&&&&&&&&&&&et.doSomething();
&&&&&&&&}&catch&(Exception&e)&{
&&&&&&&&&&&&//
&&&&&&&&}&catch&(IOException&e)&{
&&&&&&&&&&&
问题:上述程序能否编译通过?为什么?
解答:不能编译通过。因为编译的时候会报错:已捕捉到异常 java.io.IOException。&
catch(IOException e)这句有错误。
分析:对于try..catch捕获异常的形式来说,对于异常的捕获,可以有多个catch。对于try里面发生的异常,他会根据发生的异常和catch里面的进行匹配(怎么匹配,按照catch块从上往下匹配),当它匹配某一个catch块的时候,他就直接进入到这个catch块里面去了,后面在再有catch块的话,它不做任何处理,直接跳过去,全部忽略掉。如果有finally的话进入到finally里面继续执行。换句话说,如果有匹配的catch,它就会忽略掉这个catch后面所有的catch。对我们这个方法来说,抛出的是IOException,当执行etct.doSomething();时,可能会抛出IOException,一但抛出IOException,它首先进入到catch
(Exception e) {}里面,先和Exception匹配,由于OExceptionextends
Exception,根据多态的原则,IOException是匹配Exception的,所以程序就会进入到catch
(Exception e) {}里面,进入到第一个catch后,后面的catch都不会执行了,所以catch (IOException
e) {}永远都执行不到,就给我们报出了前面的错误:已捕捉到异常 java.io.IOException。
总结:在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面,Exception这个异常的根类一定要刚在最后一个catch里面,如果放在前面或者中间,任何异常都会和Exception匹配的,就会报已捕获到...异常的错误。
转自:JavaEye
已投稿到:问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
新手学java,在什么情况下要包括try catch啊?我理解的try catch 是处理异常。难道java有些方法对象 本身就要配合try catch来使用的吗?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你要try catch是因为你用的对象的方法声明可能会抛出异常的。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
除了RuntimeException以外,其它异常如果不捕获就会编译不通过,一般编译器会提示方法可能抛出异常
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
有时候有很多方法的执行不会是一撸到底那么顺畅,中间总会出岔子,报异常。要知道到底出了啥岔子,就得把异常捕获,然后采取合理的方式进行处理。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
异常捕获能够快速定位问题,一般加到你觉得可能会产生异常的代码上,选择合适的Exception和代码位置是最关键的。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
要配合日志,快速定位错误还有错误信息
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
首先并不是到处都用try catch。try catch是在可能会抛异常的时候使用的。他是一个很好的机制,但是不要滥用.甚至某些编程语言不建议使用try catch
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
catch异常有利于程序稳定性
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
一个健壮的程序并不是向我们想的那样去运行,它会在跑的过程中发生一些意外,例如数据库连上,对一个空引用调用它的方法,你要读取的本地文件不存在等等各种意外情况,这些就是异常,在写程序的时候都要考虑进去的,这时就需要捕获异常,然后对其进行特殊处理。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
Java语言是非常健壮的,非RuntimeException必须要在程序中捕获或向上抛出,总之总是要处理。try catch就是处理异常的。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
设计方法的人可以用throws声明一个函数"可能"抛某种异常
使用此方法的人必须考虑这个异常 (要么调用时try/catch,要么自己也throws把异常传出去,两个都不做就会编译错误)
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
因为臃肿......开个玩笑
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
Java的设计思想,Checked Exception。一旦一个函数抛出了非运行时异常,那么就必须在外面调用者进行try catch,以保证设计上的异常都能捕获到进行处理。但是有滥用之势。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
全局捕获程序运行时的异常么
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
2333,基本上高级编程语言都有TRY CATCH,即便没有也要想法加上错误处理以增加程序的健壮性,当然如果你和用户压根不在乎出现异常的话也可以不写。 也可以只在比较关键的位置写。 有时还需要加上事务处理。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
从现今的角度上来看,try/catch略显笨重,尤其是使用底层JDBC的时候(虽然现在这种情况很少了,在做一些非正式的对数据库的小调整的时候,引入orm是一种不太可取的做法)。到处都是try/catch。而且都是统一的SQLException,要去查底层返回的code才知道出现了什么问题。
但是这正是java包容万象的一个特征。一个大一点的项目,很多时候都会有不可控的情况,不太可能事事顺心。事事都如你所料。一个健壮完善的系统应该有应对一些意想不到的简单的问题的基础应对。这是java异常体系建立的初衷。事实上,java允许扩展异常定义,也是为了开发调试的方便。
在spring出现前,我在给开发团队搭建架构的时候,都会在业务层和数据库层引入自定义异常,允许团队的成员自行扩展,但是需要分享交流,就是应对业务系统中可能出现的先期开发中未考虑到的情况。后来这种模式受到维护人员的一致好评。因为系统出现的80-90%的异常都在我们自定义的异常范围内,很少出现runtimeexception。查找问题维护起来非常方便。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
如果没有try的话,出现异常会导致程序崩溃。而try则可以保证程序的正常运行下去,比如说:
int i = 1/0;
}catch(Exception e){
一个计算的话,如果除数为0,则会报错,如果没有try的话,程序直接崩溃。用try的话,则可以让程序运行下去,并且输出为什么出错。try catch,配合log4j使用会对程序的日后维护帮助很大。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
问:新手学java,在什么情况下要包括try catch啊?
答:普及一点基本知识:
异常的原理机制
当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往下执行程序,try块中发生异常的代码不会被重新执行。如果没有找到处理该异常的catch块,在所有的finally块代码被执行和当前线程的所属的ThreadGroup的uncaughtException方法被调用后,遇到异常的当前线程被中止。
异常的结构
Java异常结构中定义有Throwable类,Exceotion和Error是其派生的两个子类。其中Exception表示由于网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常,这类异常是可以通过Java异常捕获机制处理的。而Error表示Java运行时环境出现的错误,例如:JVM内存溢出等。
异常是程序出问题的一种本能反应,使用try catch表示你能很好处理相应代码块的异常情况,从而避免程序异常中断,反之,你就throws Exception,把异常向上一级抛出。
问:我理解的try catch 是处理异常。难道java有些方法对象 本身就要配合try catch来使用的吗?
答:再普及一点基本知识:
异常的分类
可检测异常:可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,不捕捉这个异常,编译器就通不过,不允许编译。
非检测异常:非检测异常不遵循处理或者声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已经解决了这样一个异常。
关于这点问题,建议通过查看相关源代码来分析理解,总的原则就是,只要你调用的方法中带有可检测异常,你就需要处理,try catch是一种方式,或者就throws Exception,把异常向上一级抛出。下面举例说明如下:
(用到try catch的场景)
PrintWriter pw =
pw = new PrintWriter(new File(CodeUtil.invoPath, name));
pw.write(str_invo.toString());
} catch (FileNotFoundException e) {
throw new RuntimeException(name+"文件未找到!");
(查看相关源代码分析)
public PrintWriter(File file) throws FileNotFoundException {
this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))),
(分析总结)因为构造方法PrintWriter(File file)后面跟了throws FileNotFoundException,所以你调用该构造方法时就必须对它抛出的异常进行处理。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
一般语言都是有异常处理机制的。
其中一段对于Java的异常机制进行了简单的介绍,望能帮到你。
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App2011年4月 Java大版内专家分月排行榜第二2010年8月 Java大版内专家分月排行榜第二2010年5月 Java大版内专家分月排行榜第二2008年2月 Java大版内专家分月排行榜第二2007年7月 Java大版内专家分月排行榜第二
2011年2月 Java大版内专家分月排行榜第三2010年9月 Java大版内专家分月排行榜第三2008年9月 Java大版内专家分月排行榜第三2008年1月 Java大版内专家分月排行榜第三2007年11月 Java大版内专家分月排行榜第三2007年9月 Java大版内专家分月排行榜第三
2012年8月 总版技术专家分月排行榜第三2012年7月 总版技术专家分月排行榜第三
2014年8月 高性能开发大版内专家分月排行榜第一2013年11月 高性能开发大版内专家分月排行榜第一2012年12月 Java大版内专家分月排行榜第一2012年11月 Java大版内专家分月排行榜第一2012年10月 Java大版内专家分月排行榜第一2012年9月 Java大版内专家分月排行榜第一2012年8月 Java大版内专家分月排行榜第一2012年7月 Java大版内专家分月排行榜第一2012年6月 Java大版内专家分月排行榜第一2012年5月 Java大版内专家分月排行榜第一2012年4月 Java大版内专家分月排行榜第一2012年3月 Java大版内专家分月排行榜第一2012年2月 Java大版内专家分月排行榜第一2012年1月 Java大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 catch里面抛出异常 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信