黑马程序员技术交流社区

标题: 异常处理时,应该继承哪种类? [打印本页]

作者: 齐宁宁    时间: 2014-9-21 19:44
标题: 异常处理时,应该继承哪种类?
在Java编程中的异常分为两类:编辑异常(可继承Exception)和运行异常(可继承RuntimeException),我是Java初学者,觉得异常的处理有点抽象,不是太理解,到底什么时候的异常继承Exception?什么时候继承RuntiumeException类啊?求黑马高手指点啊
作者: 杨佳名    时间: 2014-9-21 20:45
我也是正学到这个地方。
对于异常分两种:
1,编译时被检测的异常。
           对非Runtime的异常,就是有安全隐患的,要标识出去调用者就需要对其进行处理,否则编译时就会被检测到。
2,编译时不被检测的异常(运行时异常。RuntimeException以及其子类)
           对于Runtime的异常,当发生时,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。

就是定义问题时,想想它能不能被处理,如果不能被处理需要修正代码,就要继承runtime;如果可以处理,让处理后程序继续运行,就继承exception。

作者: 王路强    时间: 2014-9-21 23:51
楼上解答了  
作者: 齐宁宁    时间: 2014-9-22 13:14
杨佳名 发表于 2014-9-21 20:45
我也是正学到这个地方。
对于异常分两种:
1,编译时被检测的异常。

恩,大概知道了,谢谢啊
作者: 齐宁宁    时间: 2014-9-22 13:15
王路强 发表于 2014-9-21 23:51
楼上解答了

谢谢啊,现在知道了
作者: w936074874    时间: 2014-9-22 14:14
我的理解是预知异常不会导致程序崩溃就继承Runtime
作者: 天弓    时间: 2014-9-22 14:48
比如4/0这个异常,我们用runtime主要是我们能去处理,是可以处理的异常
作者: 齐宁宁    时间: 2014-9-22 15:06
天弓 发表于 2014-9-22 14:48
比如4/0这个异常,我们用runtime主要是我们能去处理,是可以处理的异常

我感觉Exception,是用于处理编辑异常,可以简单理解为是语法异常。而RuntimException是用于处理运行异常,可以简单理解为逻辑异常。4/0,语法没问题,但是逻辑出现问题,需要继承RuntimeException
作者: 天弓    时间: 2014-9-22 15:59
对啊   他编译是通过的 是运行中的错误 ,所以我runtime  ,如果编译就有问题的用exception
作者: wudi    时间: 2014-9-22 16:31
能处理就用runtime 不能就抛出,呵呵
作者: 齐宁宁    时间: 2014-9-22 17:09
wudi 发表于 2014-9-22 16:31
能处理就用runtime 不能就抛出,呵呵

一般的逻辑异常大都能够处理,什么情况是不能处理的呢,能不能举个例子啊
作者: 杨佳名    时间: 2014-9-22 17:37
齐宁宁 发表于 2014-9-22 17:09
一般的逻辑异常大都能够处理,什么情况是不能处理的呢,能不能举个例子啊 ...

比如角标越界(IndexOutOfBoundsException),定义一个int[] arr = {1,2,3,4};你想打印arr[4],虚拟机就认为你疯了。这样的就没必要处理了
作者: 齐宁宁    时间: 2014-9-22 19:21
杨佳名 发表于 2014-9-22 17:37
比如角标越界(IndexOutOfBoundsException),定义一个int[] arr = {1,2,3,4};你想打印arr[4],虚拟机就认 ...

我是把角标错误理解为语法错误,它超出了角标范围,逻辑上没有错误。这样的话用我上面的理解去继承Exception,也能说得通。我看到视频中有说到按照能不能处理去划分继承的类,能不能处理的判断依据是什么呢?
作者: 齐宁宁    时间: 2014-9-22 19:28
wudi 发表于 2014-9-22 16:31
能处理就用runtime 不能就抛出,呵呵

是在主函数中抛出?抛给虚拟机?怎么才算是能处理呢?是指语法错误吗?
作者: 杨佳名    时间: 2014-9-22 19:50
本帖最后由 杨佳名 于 2014-9-22 20:52 编辑
齐宁宁 发表于 2014-9-22 19:21
我是把角标错误理解为语法错误,它超出了角标范围,逻辑上没有错误。这样的话用我上面的理解去继承Except ...


我也是刚学的。我这样想,如果访问到了不存在的角标如arr[4],这时候程序该怎么去运行?当然我们知道是语法错误,但直接内部给try-catch掉合适吗?连数据都访问不到,下面的程序看都不用看就直接挂了。就需要去修正代码。day10-04又给详细举例了,可以去看看。
作者: 齐宁宁    时间: 2014-9-22 21:14
杨佳名 发表于 2014-9-22 19:50
我也是刚学的。我这样想,如果访问到了不存在的角标如arr[4],这时候程序该怎么去运行?当然我们知道是语 ...

恩,好的,谢谢啊
作者: 黑马-胡明    时间: 2014-9-22 21:24
RuntiumeException运行时异常,往往在处理异常时使用,在catch(){ throw  new RuntimeException("出现错误。");}
而,Exception是在抛出异常时使用,例如在函数上 throws Exception

作者: ______雨点ペ    时间: 2014-9-22 23:23
你这学的挺糊涂的……运行时异常在编译时不需处理,运行时异常在运行时才会出现,多数为语法错误,需要程序员手动修改语法错误;还有服务器异常,例如百度服务器出问题了,这不是你所能解决的异常;最后就是编译时异常Exception,但是exception有很多子类,这些子类在Java类库中都已经继承了exception,只有当你自己去定义一个异常类时,才会出现要继承exception的问题……
作者: LFW    时间: 2014-9-22 23:42
w936074874 发表于 2014-9-22 14:14
我的理解是预知异常不会导致程序崩溃就继承Runtime

这个不对吧,RuntimeException,非编译时异常,(语句都是正确的),但是必须要让程序停下来的异常,因为你的代码错的实在离谱,例如空指针异常、by zero,这都是让运算无法继续下去的异常,必须停下来,修改代码。

而编译时被检测异常,是因为被调用函数上声明异常,为了便于提高安全性,让调用者进行处理,调用者不处理则编译失败。



Exceptoin中有一个特殊的子类异常RuntimeException 运行时异常。

如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。

如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过;


作者: LFW    时间: 2014-9-22 23:48
齐宁宁 发表于 2014-9-22 19:21
我是把角标错误理解为语法错误,它超出了角标范围,逻辑上没有错误。这样的话用我上面的理解去继承Except ...

你想运算4/0,这就是不能处理。你去连接数据库,网络不好,挂了没连上,你的try到了,catch就写出了对应网络不好等的解决方式(重新连接),这就是能处理。你的摩托车上牌了,被偷,警察局的一看你的有牌,能处理,那就编译时被检测异常(Exception是“大类”,runtimeexception是其中的子类,要尽量写准确一点的异常,尽量不要笼统地就写Exception);你本身连摩托车都没有,警察局就不能处理,你就runtimexception。
作者: LFW    时间: 2014-9-22 23:52
你的4/0,这写继承Exception不能算是错,runtime也是Exception的一种,为什么把Java编程中的异常分为两类:编辑异常(可继承Exception)和运行异常(可继承RuntimeException)两种,是因为这样更合理,既然都不能运算下去了,不可能被处理了,何不直接停下来,让程序员改代码。(我的理解就是这样的)。你可以再去看看毕老师的4/0那个例子,就是引出runtimeexception的那个视频。
作者: Fightin黑马    时间: 2014-9-22 23:53
根据需要选择继承哪种,一般的话继承Exception
作者: 齐宁宁    时间: 2014-9-23 09:22
黑马-胡明 发表于 2014-9-22 21:24
RuntiumeException运行时异常,往往在处理异常时使用,在catch(){ throw  new RuntimeException("出现错 ...

哦哦。 这样啊,知道了,谢谢啊
作者: 齐宁宁    时间: 2014-9-23 09:25
______雨点ペ 发表于 2014-9-22 23:23
你这学的挺糊涂的……运行时异常在编译时不需处理,运行时异常在运行时才会出现,多数为语法错误,需要程序 ...

额。。。我是个菜鸟,所以又很多不懂得地方,希望大神们多多指点啊




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