Java异常处理

原创 2017年07月28日 14:02:35

Java的异常处理有两种方式:
- 默默解决。使用try...catch
- 甩锅。使用throwthrows

通常,我们喜欢用try/catch捕获异常,然后对异常进行处理。但是有时候,我们也会不予理会,直接将异常扔出去,让调用者自己去处理异常。当然对调用者来说,它也有两种同样的选择:自己处理掉,或者再往外扔,交给自己的调用者,由新的调用者继续背锅。

以下是几种正常与不正常的异常处理方式示例,从中可以看出异常处理的流程:

测试类一

正常抛出异常。声明throwsthrow

package Exception;

public class ExceptionThrow {
    public static void foo() throws Exception {
        throw new Exception("throw my exception.");
    }
}

测试类二

声明throws,但是不throw(不抛出异常):

package Exception;

public class ExceptionNotThrow {
    public static void bar() throws Exception {
        ;
    }
}

测试类三

异常已经由本方法已处理,但是仍声明throws

package Exception;

public class ExceptionHandledButThrow {
    public static void foobar() throws Exception {
        try {
            ExceptionThrow.foo();
        } catch (Exception e) {
            System.out.println("Catch an exception: " + e.getMessage());
        }
    }
}

测试类四、五:

package Exception;

import java.util.concurrent.TimeoutException;

public class InnerException {
    public static void foo() throws TimeoutException {
        throw new TimeoutException("inner timeout exception");
    }
}

package Exception;

public class OuterException {
    public static void bar() throws Exception {
        try {
            InnerException.foo();
        } catch (NullPointerException e) {
            e.getMessage();
            System.out.println("Only catch NullPointerException.");
        }
    }
}

测试类:

package Exception;

public class Main {

    public static void main(String[] args) {

        System.out.println("=========Case 1=========");

        try {
            ExceptionThrow.foo();
            System.out.println("=>1: Should never be printed!!!");
        } catch (Exception e) {
            if (e.getMessage().contains("my")) {
                System.out.println("Exception happens: " + e.getMessage());
//                e.printStackTrace();
            } else {
                System.out.println("=>2: Should never be printed!!!");
            }
        } finally {
            System.out.println("=>3: Should always be printed!!!");
        }

        System.out.println("=========Case 2=========");

        try {
            ExceptionNotThrow.bar();
            System.out.println("=>1: Should be printed!!!");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("=>2: Should never be printed!!!");
        } finally {
            System.out.println("=>3: Should always be printed!!!");
        }

        System.out.println("=========Case 3=========");

        try {
            ExceptionHandledButThrow.foobar();
            System.out.println("=>1: Should be printed!!!");
        } catch (Exception e) {
            System.out.println("=>2: Should never be printed!!!");
        }

        System.out.println("=========Case 4=========");

        try {
            OuterException.bar();
        } catch (Exception e) {
            System.out.println("In main: " + e.getMessage());
    }
}

结果

=========Case 1=========
Exception happens: throw my exception.
=>3: Should always be printed!!!
=========Case 2=========
=>1: Should be printed!!!
=>3: Should always be printed!!!
=========Case 3=========
Catch an exception: throw my exception.
=>1: Should be printed!!!
=========Case 4=========
In main: inner timeout exception

分析

  • Case1:try在捕获到异常之后,直接进入catch,运行catch之内的部分。catch可以根据异常的情况,进行不同的处理逻辑。
  • Case2:如果try捕获不到异常,将继续执行try后面的部分,catch部分则直接跳过。(eg:ExceptionNotThrow.bar(),只声明throws却不throw,相当于方法永不会抛出异常,则处理这个方法异常的try永远都不会捕获到异常)
  • Case3:如果本方法(eg:ExceptionHandledButThrow.foobar())已经处理了异常,还声明throws,则调用者同样在try块里永远都不会捕获到异常(因为异常已经被处理了),但是调用者必须有try/catch,因为所调用的方法(foobar())虽然不抛异常,但是坑爹地声明了throws
  • Case4:如果本方法没有catch住被调用者抛出的异常,则必须将异常继续throws出去,否则会报错。
版权声明:本文为博主原创文章,未经博主允许不得转载。

java--异常处理的实例

/* 时间: 2012-10-10 作者: 烟大 程序要求: 熟悉异常处理机制; try { 可能出现异常的代码; } catch { 对异常进行处理...
  • wangyang1354
  • wangyang1354
  • 2012年10月11日 23:11
  • 5546

Java 异常处理机制(异常链)

JVM (Java 虚拟机 的缩写)用方法调用栈来跟踪一系列的方法调用过程。该堆栈保存了每个调用方法的本地信息。当一个新的方法被调用时,JVM把描述该方法的栈结构置入栈顶,位于栈顶的方法为正在执行的方...
  • qq_18505715
  • qq_18505715
  • 2017年06月10日 17:31
  • 277

JAVA 异常处理练习

//仅作为学习笔记 /* 异常练习1 */ class NoValueException extends Exception { NoValueException(String...
  • wu_lai_314
  • wu_lai_314
  • 2013年03月08日 00:20
  • 863

Java异常处理方式

前言     平时在开发的时候避免不了的出一些大大小小的不同类型的错误,这时候,对于这些异常怎么处理呢,显得至关重要了。 内容 分类 Trowable:有两个重要的子类,Exception(异...
  • zlt995768025
  • zlt995768025
  • 2016年07月13日 11:30
  • 378

java进行异常处理时的注意事项

java进行异常处理时的注意事项 (1)try、catch和finally这三个关键字不能单独使用,否则编译出错。 (2)try语句块后既可以只使用catch语句块,也可以只使用final...
  • qq_33406883
  • qq_33406883
  • 2017年01月03日 22:02
  • 411

C++的和Java的异常机制

    程序总会出现异常的,需要我们去处理。C++和JAVA都有自己异常机制,我们应该遵循着去处理异常。那它们的异常机制有何异同呢?    要注意一点:异常机制处理异常是要付出代价的,即异常处理的代码...
  • Windy83
  • Windy83
  • 2006年11月17日 01:37
  • 1929

高效Java异常处理机制

高效Java异常处理机制           Java开发人员做出的有关架构的最重要的决定之一便是如何使用Java异常模型。Java异常处理成为社区中讨论最多的话题之一。一些人认为J...
  • jokewangloveyou
  • jokewangloveyou
  • 2014年07月09日 19:41
  • 686

Java异常处理小结

[引用请注明出处:http://blog.csdn.net/bhq2010/article/details/9109809] 最近一个月都在做demo,对Java的异常处理有了一点感受,小结在这里,其...
  • bhq2010
  • bhq2010
  • 2013年06月17日 11:49
  • 2562

Java异常处理总结

Java异常处理总结 异常(Exception):指程序运行过程中出现的非正常现象。   1、  Java异常的异常处理机制   早期的情况: 早期使用的程序设计语言是没有提供专门进行异常处理功能的,...
  • sunleis
  • sunleis
  • 2013年10月31日 23:52
  • 964

java学习之路 之 异常处理练习题

/** * 异常的分类 : * 1) 按照严重程度 * 1) Error 严重错误 * 2) Exception 普通异常 * 2) 按照处理要求来分 * 1) 受检异常 ...
  • OnlyLove_longshao
  • OnlyLove_longshao
  • 2016年08月16日 23:39
  • 1647
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java异常处理
举报原因:
原因补充:

(最多只允许输入30个字)