黑马程序员技术交流社区

标题: 运行异常和一般异常 [打印本页]

作者: ①人←①城市    时间: 2013-4-12 14:59
标题: 运行异常和一般异常
本帖最后由 ①人←①城市 于 2013-4-13 17:13 编辑

在平时的开发中用try{}catch(...){...}这里抛出的异常属于那种?为何?

作者: 何俊森    时间: 2013-4-12 16:26
Throwable包含Exception 和Error。
        error是虚拟机的一个故障(虽然它可以是任何系统级的服务),听说有致命那么严重。我们来引用JavaDoc对Error的定义:“Error是Throwable的一个子集,它指的是一个合理的应用程序不能截获的严重的问题。大多数都是反常的情况。”  

Java提供了两类主要的异常:Runtime Exception和Checked Exception。checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

      但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常并且这种异常还是最常见的异常之一。;又如数组越界一样、我们也没有必要每次遍历和访问数组时候都try、catch一下,那要多累。
      出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止 。
作者: 何俊森    时间: 2013-4-12 16:28
何俊森 发表于 2013-4-12 16:26
Throwable包含Exception 和Error。
        error是虚拟机的一个故障(虽然它可以是任何系统级的服务),听 ...

所以try...catch的属于一般异常。
作者: 何俊森    时间: 2013-4-12 16:35
如果还有什么疑问,参考http://bbs.itheima.com/search.ph ... C%E5%BC%82%E5%B8%B8
版主,楼主,抱歉我又复制粘贴了。我觉得有前人总结得很好了,我觉得没有必要在发时间自己码字了。
作者: 想学跑的猪    时间: 2013-4-12 18:18
1.在发生异常的地方直接处理;

2.将异常抛给调用者,让调用者处理。

Java异常可分为3种:

  (1)编译时异常:Java.lang.Exception

  (2)运行期异常:Java.lang.RuntimeException

  (3)错误:Java.lang.Error

Java.lang.Exception和Java.lang.Error继承自Java.lang.Throwable;

Java.lang.RuntimeException继承自Java.lang.Exception.

编译时异常: 程序正确,但因为外在的环境条件不满足引发。例如:用户错误及

I/O问题----程序试图打开一个并不存在的远程Socket端口。这不是程序本身的逻

辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开

发者必须考虑并处理这个问题。Java编译器强制要求处理这类异常,如果不捕获这

类异常,程序将不能被编译。

运行期异常: 这意味着程序存在bug,如数组越界,0被除,入参不满足规范.....

这类异常需要更改程序来避免,Java编译器强制要求处理这类异常。

错误: 一般很少见,也很难通过程序解决。它可能源于程序的bug,但一般更可能

源于环境问题,如内存耗尽。错误在程序中无须处理,而有运行环境处理。
作者: 想学跑的猪    时间: 2013-4-12 18:27
处理异常的方式有两种
1.在发生异常的地方直接处理;
2.将异常抛给调用者,让调用者处理。

特殊异常指的是RuntimeException,及其子类异常,try{}catch(){}属于在发生异常的地方进行直接处理,在try{}catch(){}块里的异常对于特殊的异常检测到,然后将其抛出,不需要用catch去处理异常。其他的异常则可以用以上两种方式进行处理
作者: 曹宇    时间: 2013-4-12 18:35
运行时异常,就是运行阶段出现了程序不能继续运行的异常,如一个程序,你传错了参数类型,造成程序不能正确运行的情况下,就需要定义运行时异常,这时,如果参数错误的话,程序就直接停止运行并抛出运行时异常.  
运行时异常可以不声明   可不带 try catch

一般异常 就必须要声明 要带try catch
它作用在一些出现错误 但是只要经过正确处理程序仍然可以继续运行情况.

如有好几个 if 判断,其中一个判断的数值出现错误,并不影响其他 if 判断的运行,那么 出错的就应该抛出一般异常,进行处理,且这样不影响其他if的继续运行.
作者: 王大斌    时间: 2013-4-12 18:38
异常分为免检异常和必检异常,免检异常也就不用使用trycatch来处理了,因为它可能出现在程序的任何地方,不可能都处理。
必检异常必须要处理,要么抛出,要么使用trycatch块来处理
作者: 打工人    时间: 2013-4-12 23:14

如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者: PANZERLEADER    时间: 2013-4-12 23:33
JAVA中的异常氛围Exception和Error两类。

Error是比Exception严重的多的异常,通常不是通过try{}catch{}来捕获,因为存在这种类型的错误,JVM根本不会执行代码,而是报错让程序员改动代码。

Exception则类似小问题,一般通过try{}catch捕获就行,catch中决定处理方法。同时这种异常也可以通过方法声明throws抛给方法调用者去解决。

一般try……catch和throws不会连用,因为捕获了就要处理,要么就不处理抛给调用者了。
作者: 16463535    时间: 2013-4-13 00:40
楼上的几位已经把异常的概念介绍的非常清楚了。在这里我不过多说明。
我在看你的问题时,感觉你是不是想问:在try{}catch(...){...}中为何还要  new 异常对象然后抛出?
比如:
                  try
                {
                        。。。。
                }
                catch (IOException e)
                {
                        。。。。。。
                                throw new RunTimeException("程序结束");
                }

如果你想问的是这种情况的话,那么你可以这么理解,当程序捕捉到异常后,而且这个异常是一个无法处理的异常,那么只有让程序停掉。

就目前我们学习的知识中IO中运用的较多一些,比如 文件找不到异常。当你给定的文件路径是错误的时候,那么就没办法处理了,所以程序只要停掉。

我知识简单的说明,不知道你是不是想问这个。如果是,具体的请看毕老师的 IO 视频。
作者: hacket    时间: 2013-4-13 00:52

1) error都是继承自父类java.lang.Error,而exception都继承自java.lang.Exception.

2)  再看看JDK中对于java.lang.Error和java.lang.Exception的解释。
    java.lang.Error:
    An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions.
    即:Error是Throwable的子类,用于标记严重错误。合理的应用程序不应该去try/catch这种错误。绝大多数的错误都是非正常的,就根本不该出现的。     
    java.lang.Exception:
    The class Exception and its subclasses are a form of Throwable that indicates conditions that a reasonable application might want to catch.
    即Exception 是Throwable的一种形式的子类,用于指示一种合理的程序想去catch的条件。即它仅仅是一种程序运行条件,而非严重错误,并且鼓励用户程序去catch它
所以需要try{}catch(){}的为Exception




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