Thinking-in-Java-读书笔记-12-通过异常处理错误

原创 2018年04月15日 16:32:30

Thinking in java 读书笔记

Java 的基本理念是 「结构不佳的代码不能运行。

发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前。然而,编译期间并不能找出所有的错误,余下的问题必须在运行期间解决。这就需要错误源通过某种方式,把适当的信息传递给某个接受者—接收者将知道如何正确处理这个问题。

基本异常

异常情形是指阻止当前方法或作用域继续执行的问题。除法就是一个简单的例子。除数有可能为 0,所以先进行检查很有必要。但除数为 0 代表的究竟是什么意思?通过当前正在解决的问题环境,或许能知道该如何处理除数为 0 的情况。但如果这是一个意料之外的值,你也不清楚该如何处理,那就抛出异常,而不是顺着原来的路径继续执行下去。

class ExceptionTest {
    public static void main(String[] args) {
        int a = 0;
        try {
            System.out.println("1111");
            if (a == 0) {
                System.out.println("2222");
                throw new NullPointerException("a cannot be 0");
            }
        } catch (Exception e) {
            System.out.println("3333");
            e.printStackTrace();
            System.out.println("e:" + e.getMessage());
        } finally {
            System.out.println("4444");
        }
    }
}

上面就是简单的异常处理情况,对于 a==0 这种 异常情况,我们主动抛出异常,异常的抛出方式类似 Java创建对象的过程,直接 new NullPointerException()的方式创建我们非常熟悉的 空指针 异常。

这个时候编译器会提示你需要将抛出的异常 try catch 掉。那么就按照提示对出现异常的位置进行捕获。在 catch 的地方进行异常的处理。

finally 块内的代表着无论是否出现异常,这段代码块的内容都会执行。

看一下运行效果:

java.lang.NullPointerException: a cannot be 0
1111
2222
3333
e:a cannot be 0
4444
    at chapter12.ExceptionTest.main(ExceptionTest.java:20)

创建自定义异常

不必拘泥于 Java 中已有的异常类型。 Java 提供的异常体系不可能预见所有的希望加以报告的错误,所以可以自己定义异常类来表示程序中可能会遇到的特定问题。

class CustomException {

    static void f() throws MyException {
        System.out.println("1111");
        throw new MyException();
    }

    public static void main(String[] args) {
        try {
            System.out.println("2222");
            f();
        } catch (MyException e) {
            System.out.println("3333");
            e.printStackTrace();
        }
    }
}

class MyException extends Exception {

}

异常的栈轨迹

printStackTrace() 方法所提供的信息可以通过 getStackTrace() 方法来直接访问,这个方法将返回一个由栈轨迹中的元素所构成的数组,其中每一个元素都表示栈中的一帧。看一下代码演示:

class StackTraceTest {
    static void f() {
        try {
            throw new NullPointerException("null");
        } catch (Exception e) {
            for (StackTraceElement stackTraceElement : e.getStackTrace()) {
                System.out.println(stackTraceElement.getMethodName());
            }

        }
    }

    static void g() {
        f();
    }

    static void h() {
        g();
    }

    public static void main(String[] args) {
        f();
        System.out.println("----------");
        g();
        System.out.println("----------");
        h();
    }
}

输出结果:

f
main
----------
f
g
main
----------
f
g
h
main

一层一层的展示异常栈内的信息。

finally

对于一些代码,可能会希望无论 try 块中的异常是否抛出,它们都能得到执行。这通常适用于内存回收之外的情况。为了达到这个效果,可以在异常处理程序后面加上 finally 子句。

class FinallyTest {

    static void f(int i) {
        try {
            System.out.println("111");
            if (i == 1) {
                return;
            }
            System.out.println("222");
            if (i ==2) {
                return;
            }
            System.out.println("222");
            if (i ==3) {
                return;
            }
            System.out.println("end");

        } finally {
            System.out.println("finally clean up");
        }
    }
    public static void main(String[] args) throws Exception{
        for (int i = 1; i < 5; i++) {
            f(i);
        }
        System.out.println("5555555");
        throw new NullPointerException("dd");
    }
}

输出结果:

Exception in thread "main" java.lang.NullPointerException: dd
    at chapter12.FinallyTest.main(FinallyTest.java:40)
111
finally clean up
111
222
finally clean up
111
222
222
finally clean up
111
222
222
end
finally clean up
5555555

总结

异常是 Java 程序设计不可分割的一部分,如果不了解如何使用它们,那你只能完成很有限的工作。异常处理的有点之一就是它使得你可以在某处集中精力处理你要解决的问题,而在另外一处处理你编写的这段代码中产生的错误。尽管异常通常被认为是一种工具,使得你可以在运行时报告错误并从错误中恢复。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_22656383/article/details/79950455

Java编程思想第四版读书笔记——第十二章 通过异常处理错误

第十二章 通过异常处理错误
  • severusyue
  • severusyue
  • 2016-06-29 16:47:09
  • 1735

java编程思想笔记12-通过异常处理错误

java的基本理念是"结构不佳的代码不能运行".12.1 概念程序在编译时期和运行时期会发生的错误.12.1 基本异常当抛出异常后,有几件事情会随之发生.首先,通java中其他创建对象的创建一样,将使...
  • qq_22986265
  • qq_22986265
  • 2018-01-17 21:10:09
  • 46

Java编程思想之通过异常处理错误

1.     异常分为被检查的异常和运行时异常,被检查的异常在编译时被强制要求检查。异常被用来错误报告和错误恢复,但很大一部分都是用作错误报告的。 2.     异常情形是由于当前环境下无法得到必要...
  • qq_33403693
  • qq_33403693
  • 2017-08-03 18:11:24
  • 184

java编程思想 第十二章 通过异常处理错误

java编程思想 第十二章 通过异常处理错误 异常处理机制,理论,创建自定义异常,异常与记录日志,异常说明,被检查的异常,fillInStachTrace,重新抛出异常,异常链,Throwable,...
  • liuyesuifen
  • liuyesuifen
  • 2016-10-07 01:16:41
  • 275

Java编程思想(十一) —— 通过异常处理错误(下)

Java编程思想(十) —— 通过异常处理错误(2)
  • iaiti
  • iaiti
  • 2014-09-12 08:35:40
  • 2111

java编程思想读书笔记----第十二章 通过异常处理错误

发现异常的理想时期是在编译期,也就是在试图运行代码之前。然而编译期不能找到所有的错误,余下的问题必须在运行期间解决,也就是异常处理。...
  • Q12271235
  • Q12271235
  • 2017-03-08 10:12:34
  • 191

Java编程思想读书笔记——通过异常处理错误(二)

12.7 Java标准异常 Throwable可以表示任何作为异常被抛出的类,其可分为两类对象:Error和Exception。 Error表示编译时和系统错误,一般不需关心; Exceptio...
  • baidu_21088863
  • baidu_21088863
  • 2017-10-22 14:59:52
  • 68

Java编程思想读书笔记——通过异常处理错误(一)

第十二章 通过异常处理错误 12.1 概念 12.2 基本异常 异常情形(exceptional condition):阻止当前方法或作用域继续执行的问题。 普通问题:在当前环境下能得到足够的...
  • baidu_21088863
  • baidu_21088863
  • 2017-10-15 16:58:11
  • 70

java编程思想读书笔记 第十二章 通过异常处理错误(上)

java异常处理的目的在于通过使用少于目前数量的代码来简化大型、可靠的程序的生成,并且通过这种方式可以使你更加自信。本章将介绍如何编写正确的异常处理程序,并将展示当方法出问题的时候,如何产生自定义异常...
  • abc709272013
  • abc709272013
  • 2016-10-09 22:26:36
  • 227

java编程思想读书笔记 第十二章 通过异常处理错误(下)

1.异常的限制 当覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常。这意味着,当基类使用的代码应用到其派生类对象的时候,一样能够工资,异常也不例外。 下面的例子是在编译时施加在异常上面...
  • abc709272013
  • abc709272013
  • 2016-10-11 22:26:46
  • 1220
收藏助手
不良信息举报
您举报文章:Thinking-in-Java-读书笔记-12-通过异常处理错误
举报原因:
原因补充:

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