码迷,mamicode.com
首页 > 编程语言 > 详细

《Thinking in Java》学习笔记(五)

时间:2015-04-20 00:30:52      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

1. Java异常补充

  a.使用try/catch捕获了异常之后,catch之后的代码是会正常运行的,这是很多新手会犯的错误。

public class ExceptionTest {

    public static void main(String [ ] args) {
        try{
            throw new RuntimeException();
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println("still operate here!");
    }
    
}

  将输出:

  java.lang.RuntimeException
  still operate here!
     at exception.ExceptionTest.main(ExceptionTest.java:20)

  b.捕获多个异常时,一旦匹配将退出,因此捕获Exception时应该放到最后,否则连编译都通不过

public class ExceptionTest {

    public static void main(String [ ] args) {
        try{
            throw new RuntimeException();
        }catch(Exception e){
            e.printStackTrace();
        }catch(RuntimeException e){
            e.printStackTrace();
        }
        System.out.println("still operate here!");
    }
    
}  

  在catch(RuntimeException e){这一行会报错:

    unreachable block for RuntimeException.It is handled by the catch block for Exception。

  正确的顺序是先捕获RuntimeException,再尝试捕获Exception。

  c.告诉调用方法的调用者可能会抛出异常,可以在方法后面加上throws,然后在方法中thorw。这样别人再调用该方法时就必须处理该异常或者抛出该异常。

  下面是BufferedInputStream中的例子:

private byte[] getBufIfOpen() throws IOException {
    byte[] buffer = buf;
    if (buffer == null)
        throw new IOException("Stream closed");
        return buffer;
    }

  需要注意的是,方法后面加上throws,方法内部不一定非要thorw。

  下面是InputStream中的例子:

 public int available() throws IOException {
    return 0;
 }

  d.捕获异常时,子类的异常也可以被父类的try/catch所捕获。

public class ExceptionTest {

    public static void main(String [ ] args) {
        try{
            throw new SubException();
        }catch(MyException e){
            e.printStackTrace();
        }
    }
    
}

class MyException extends Exception{}

class SubException extends MyException{}  

  将会输出:

exception.SubException
   at exception.ExceptionTest.main(ExceptionTest.java:15)

  注意只能先捕获子类异常,再捕获父类异常。

  e.将检查时异常变为运行时异常

  如果调用的方法抛出了一个异常,我们在调用时就需要进行处理,如果不知道怎么处理,又不想catch之后什么都不做(这样是很不好的),可以向上抛出异常或者抛出运行时异常。  

public class ExceptionTest {

    public static void main(String [ ] args) throws IOException{
        try{
            InputStream is = new FileInputStream(new File("abc.txt"));
            is.read();
        }catch(IOException e){
            //e.printStackTrace();
            //throw e; //自己无法处理时向上抛出
            throw new RuntimeException(e);
        }
    }
    
}

  注意,如果方法内throw,则需要再次捕获或者方法上throws。

  

 

《Thinking in Java》学习笔记(五)

标签:

原文地址:http://www.cnblogs.com/lnlvinso/p/4440411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!