异常

2018-12-19  本文已影响0人  爱做梦的严重精神病患者

1.异常

 所有的异常都是由Throwanle继承而来的,但是在下一层立即分解为两个分支ErrorException
Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误一般程序运行时不会抛出这种内部错误
Exception层次结构又分解为两个分支由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于IOException

 派生于RuntimeException的异常包括下面几种情况:

 如果出现RuntimeException的异常(非受查异常),那么一定是你的问题。

 派生于IOException的异常包括:

 派生于Error类或RuntimeException类的所有异常称为非受查异常,其余的异常(IOException)称为受查异常

Java异常层次结构.jpg

2.声明、抛出、捕获异常

class MyAnimation {
  public Image loadImage(String s) throws FileNotFoundException, EOFException {
        ...
      }
}
String readData(Scanner in) throws EOFException {
        ...
        while(...) {
           if(!in.hasNext()) {
               if(n < len)
                  throw new EOFException();
            }
        }
}
try {
  code
  ...
} catch(ExceptionType e) {
   handle for this type
}

 通常,我们应该捕获那些知道如何处理的异常,而将那些不知道怎样处理的异常继续进行传递(抛出)

try {
    access the database
} catch (SQLException e) {
    //  创建一个子系统异常
    Throwable se = new ServeltException("database error");
    se.initCause(e);
    throw se;
}

这种包装技术可以让用户抛出子系统中的高级异常,而不会丢失原始异常的细节

InputStream in = ...;
try {
    try{
        code that might throw exceptions
    } finally {
        in.close();
    }
} catch (IOException e) {
       show error message
}

内层的try语句只有一个职责,就是确保关闭输入流外层的try语句块也只有一个职责,就是确保报告出现的错误。这种设计方式不仅清楚,而且还具有一个功能,就是将会报告finally子句中出现的错误。

try(Resource res =...) {
      work with res
}

try(Scanner in = new Scanner(new FileInputStream("/usr/share/dict/words")), 
"UTF-8") {
      while(in.hasNext())
               System.out.println(in.next());
}

try块退出时,会自动调用res.close(),就好像使用了finally块一样。

上一篇下一篇

猜你喜欢

热点阅读