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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liqi 中级黑马   /  2014-8-2 22:44  /  2081 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

免检异常:RuntimeException,  从字面理解:编译时检测通过,运行时出现错误,需要修改代码
普通异常:编译不能通过,修改代码。
这两个出错都一定要程序员修改代码?怎么感觉没区别啊

6 个回复

倒序浏览
本帖最后由 王松朝 于 2014-8-2 23:50 编辑

普通异常是指的一些达不到预期目的的异常,比如:这里有 0 个苹果,真好,我要拿个苹果吃

RuntimeException是运行时异常,指的是运行是发生逻辑错误
比如: 今天我被苹果吃了
或者: 今天被苹果吃了



回复 使用道具 举报
王松朝 发表于 2014-8-2 23:40
普通异常是指的一些达不到预期目的的异常,比如:这里有 0 个苹果,真好,我要拿个苹果吃

RuntimeExceptio ...

谢谢,例子很容易理解
回复 使用道具 举报
本帖最后由 怀念黑海岸 于 2014-8-3 16:05 编辑

有区别的,你首先就得弄明白为什么运行时异常就可以通过编译,而普通异常不行,即使你抛出这个运行时异常出去,调用抛出这个异常的方法的地方都不需要对这个可能出现的异常进行预防处理,看好是可能出现,为什么是可能出现而不是一定出现,原因很简单,举个简单例子:你调用了一个方法,sleep(),并接受一个参数的传入,传入参数就是sleep方法睡的时间,但是如果你传入的是一个负数了,你的sleep方法该怎么办:你们这些调用者还能不能让我快乐的运行了。对了,此时导致问题的发生不是因为你这个sleep方法出错了,而是因为调用者的错误调用导致的,那你能做的就是马上停止程序并修改程序,因为误传参数已经影响到程序功能的正常运行了。而纵观那些运行时异常都是在使用他们的时候因使用不当才导致异常产生,所以能通过编译,而不需要抛出异常进行处理。因为这段功能代码本身就没有错,那虚拟机在对其进行编译时为什么不让它通过呢?但是你处理了这些运行时异常的话程序还能继续执行,你觉得这样子好吗?错误的使用了这些异常产生的地方还导致非预期的运行结果产生,你程序即使运行下去了还有意思吗?
       补充一点:当我们在书写自己的异常时,究竟是继承Exception呢还是RuntimeException,就是取决于上面的原因。
回复 使用道具 举报
RuntimeException,运行时异常,编译时能通过,运行时发生无法解决的问题,例如div(4,0)的那个例子,4除0压根就不能被处理,代码本身存在BUG,必须停掉进行修改,处理RE异常不是try-catch能解决的,必须更改代码。还有ArrayIndexOutOfBoundsException,数组下标越界,数组定义的长度不够实际使用,不修改代码肯定会报错,都是RE异常,try-catch在这里使用毫无意义。 所以毕老师说(RE异常): 如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。 如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过; 之所以不用在函数声明,是因为不需要让调用者处理。》》》因为调用者压根无法处理 当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。  编译时异常,是会编译时会被检测的异常,必须抛出或try-catch,意思是这段代码可能会出现问题,调用者必须对其进行处理,你如果不处理,就让编译失败。它是能被处理的异常。
回复 使用道具 举报
怀念黑海岸 发表于 2014-8-3 11:03
有区别的,你首先就得弄明白为什么运行时异常就可以通过编译,而普通异常不行,即使你抛出这个运行时异常出 ...

:D受教了。谢了
回复 使用道具 举报
liqi 中级黑马 2014-8-3 12:00:00
7#
LFW 发表于 2014-8-3 11:04
RuntimeException,运行时异常,编译时能通过,运行时发生无法解决的问题,例如div(4,0)的那个例子,4除0 ...

我也是这样做笔记的,可是看这些话总是不开窍,奇了怪了,线程等都没问题,被异常给绕晕了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马