java-异常处理

来源:互联网 发布:淘宝规则适用者 编辑:程序博客网 时间:2024/06/17 10:09

try-catch语句

Java提供了名为try-catch块的结构。将运行可能产生的可疑代码封闭到try代码块中,将异常处理放在catch块中。

try {    //可能导致异常的代码}catch(ExceptionType exceptionObjectName) {    //异常处理}

在try块中的代码执行出现异常时,Java将创建exception对象。
在类层次结构中的顶部是Throwable类。所有的异常类包括自己设计的异常类和Error都继承自Throwable类。
在希望处理不同类型的异常时,代码将包含多个catch块,这些块在代码中定义的顺序非常重要,因为在try块中抛出异常时,catch语句会按照它们在代码中定义的顺序逐个检查。如:

try {    //可能出现异常的代码块}catch(ReadOnlyBufferException e1) {    //异常处理}catch(UnsupportedOperationException e2) {    //异常处理}catch(Exception e3) {    //异常处理}

这样会优先处理ReadOnlyBufferException的异常,接着会是UnsupportedOperationException的异常,最后才会处理Exception中的异常。
为了在同一条catch语句中捕获多种异常,Java SE 7增加了新的语法,如下所示:

try{    //可能导致异常代码块}catch(ReadOnlyBufferException | UnsupportedOperationException e) {    //异常处理}

子类异常必须在父类异常之前处理,否则子类异常将永远不会被调用。
典型的try-catch-finally语句代码如下:

try {    //可能导致异常代码块}catch(Exception e) {    //异常处理代码块}finally {    //无论是否有异常发生,这里总是会被调用}

finally通常对于清理代码或在try块中创建的任何乱七八糟的东西通常是有用的。

finally块的使用准则:

可以将try块和finally块结合使用而无需catch块:

try {    //可能发生异常代码块}finally {    //资源释放}

Java的finally语法存在设计缺陷。finally块允许包含一条跳转语句,比如break。如果从throw语句进入finally块,在finally块中执行break、continue或return语句将覆盖throw语句并终止错误处理。
有return的时候

try {    //可能又异常    return 0 ;}catch (Exception e) {    // TODO: handle exception    System.out.println("有异常发生" + e.getMessage());    return 1;}finally {    System.out.println("总是会被执行");}

看了有些对finally在有return时的介绍,用代码实现下结果发现好像和一些解释的并不一样,也可能是自己理解有问题。以下是自己测试结果:

  • 如果没有发生异常,返回0;
  • 有异常发生,如果return在catch里,finally中没有return,返回1
  • 有异常发生,如果return在整个代码块最后,返回该return。catch中return会导致编译错误。
  • 无论是否有异常发生,如果finally中有return,返回该return

对于带资源的try语句,如果需要在结束的时候自动清理,可以使用

try(expression) {    blockStatements}

比如:

try(InputStream fis = new FileInputStream(source)) {    ...}//可以分配多个资源,唯一的限制是这些资源都必须实现java.lange.AutoCloseabletry(InputStream fis = new FileInputStream(new File("src.txt"));    OutputStream fos = new OutputStream("desc.txt")) {        ...}

使用这种方式后,不必费心关闭,java会自动进行关闭。

throws和throw

throws会将异常抛出给调用者。

void readData() throws IOException, NumberFormatException {}

这样在捕获异常这种行为可以在方法被调用出进行。
你可以自定义异常

class TooHotException extends Exception {    public TooHotException(String message){        super(message);    }}class TooColdException extends Exception {    public TooColdException(String message){        super(message);    }}...void takeTour() throws TooHotException, TooColdException {    int temperature = ...    if(temperature > 28) {        throw new TooHotException("Too hot");    }else if(temperature < -22) {        throw new TooColdException("Too cold");    }}

throws语句声明了方法会将执行过程中产生的异常传递给方法的调用者,而throw语句明确地创建或者获取异常对象并把异常对象传递给调用者。
重新抛出异常。

try {    //blockStatements}catch(ExceptionType exceptionObjectName) {    //blockStatements    throw (exceptionObjectName)}
原创粉丝点击