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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马_位志国 中级黑马   /  2013-3-9 19:36  /  1743 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马_位志国 于 2013-3-11 20:59 编辑

为什么Exception及其子类(除了RuntimeException及其子类)在抛出异常时,若不在所在函数体内处理,必须在函数上抛出异常类?
我知道RuntimeException是Exception的子类,但为什么一个要抛出,一个不要抛出?
具体怎样来限制RuntimeException不需要在函数上抛出异常类的?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
本帖最后由 赵彦辉 于 2013-3-9 19:44 编辑

异常分类:java.lang.Throwable的两个子类   
       Error类:该类代表错误,指程序无法恢复的异常,对于所有错误类型及其子类,都不要求程序进行处理。常见的Error类型:如内存溢出 StacOverflowError等
       Exception该类代表异常,指程序有可能恢复的异常,该类是整个Java语言异常类体系中的父类,使用该类就可以代表所有的异常清理。
         在这些异常类中,根据是否程序自身导致的异常,将所有的异常类分为两种:
  RuntimeException及其子类
该类属于程序运行时异常,即程序自身的问题所导致的异常。如数组下标越界异常
      ArrayIndexOutofBoundsException等,该类异常在语法上不强制程序员必须处理,即使不处理这样的异常也不会出现错误。
其他Exception子类
   该类异常属于程序外部问题引起的异常,即程序运行时某些外部问题导致产生异常,例如文件不存在异常 FileNotFoundException,该类异常在语法上要求强制出来,如不处理则会出现语法错误。
异常的处理   
java的异常处理方式有两种:

1、 try…..cathc…finally结构对异常进行捕获和处理
try
{   
    //可能抛出的异常代码
}
catch(ExceptionType1 e2)
{
      //抛出异常ExceptionType1时的异常处理代码
}
catch(ExceptionType2 e2)
{   
      //抛出ExceptionType2时的异常代码
}
finally
{
   //无论是否抛出异常,都会执行的代码
}
try语句块中是可能抛出的代码,如果该块内的代码没有出现异常,后面的各个catch块都不起任何作用。
但如果该块中的一条语句抛出了异常,则其后续语句不在执行,而是转到catch进行异常类型匹配

catch语句块负责捕获指定类型的异常并进行处理。一个try块可以对应多个catch块,用于对多个异常类进行捕获,
如果要捕获的各个异常类之间没有继承关系,各个catch块的顺序无关紧要,但如果它们之间有继承关系,
则应将子类的catch块放在父类的catch块之前。因此Exception这个异常类的根类一定要放在最后一个catch里面。
在catch块中可以用getMessage()方法返回一个对发生的异常进行描述的字符串,用printStackTrace()方法打印方法的调用序列。
catch语句捕捉的范围要由小到达.

finally语句块是可选的,无论是否发生异常,finally语句块总会执行,一般用于释放资源,关闭文件等。
2、throw 或throws抛出
异常一般情况下,异常是由系统自动捕获的,但如果程序员不想再当前方法内处理异常,可以用throw语句将异常抛出到调用方法中。
调用方法也可以将异常再抛给其他调用方法,如果所有的方法都选择了抛出此异常,最后JVM将捕获它,输出相关错误信息,
终止程序运行。格式: throw new ExceptonTye(异常信息)
如果一个方法没有捕获可能抛出的异常,调用该方法的其他方法应该捕获并处理异常。为了明确指出一个方法不捕获异常,
而让调用该方法的其他方法捕获该异常,可以在声明方法的时候,使用throws抛出该类异常,如果抛出的是多个不同异常,
中间用逗号隔开。格式:public static void main(String[] args)thows 异常类型名 { }

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马