首页 > 编程语言 > Java编程思想7

Java编程思想7

时间:2022-12-24 23:56:11浏览次数:44  
标签:Java 思想 编程 sw try catch off 异常 public

第十二章:通过异常处理错误
Java的基本理念是“结构不佳的代码不能运行”。

​ 发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前。然而,编译期间并不能找出所有的错误,余下的问题必须在运行期间解决。Java使用异常来提供一致的错误报告模型,使得构件能够与客户端代码可靠地沟通问题。

​ 异常情形是指阻止当前方法或作用域继续执行的问题。把异常情形和普通问题区分相当重要,所谓普通问题是指,在当前环境能够得到足够的信息,总能处理这个错误。而对于异常 情形,就不能继续下去了,因为在当前环境下无法获得必要信息来解决问题。你所能做的就是从当前环境中跳出,并且把问题交给上一级环境,这就是抛出异常时所发生的事情。

​ 与使用Java中的其它对象一样,我们总是用new在堆上创建异常对象,这也伴随着存储空间的分配和构造器的调用。所有标准异常类都有两个构造器:一个是默认构造器;另一个是接受字符串作为参数,以便能把相关信息放入异常对象的构造器,如throw new NullPointerException("t = null");。此外,能够抛出任意类型的Throwable对象,它是异常类型的根类。通常对于不同类型的错误,要抛出相应的异常。错误信息可以保存在异常对象内部或者使用异常类的名称来暗示。

​ 捕获异常:要明白异常是如何被捕获的,必须首先理解监控区域的概念。它是一段可能产生异常的代码,并且后面跟着处理这些异常的代码。在try块里“尝试”各种(可能产生异常的)方法调用。当然,抛出的异常必须在某处得到处理,这个地点就是异常处理程序 ,而且针对每个要捕获的异常,得准备相应的处理程序。异常处理程序紧跟在try块之后,以关键字catch表示:

try {
// code that might generate exceptions
} catch (Type1 t1) {
// handle exception of Type1
} catch (Type2 t2) {
// handle exception of Type2
} catch (Type3 t3) {
// handle exception of Type3
}

​ 每个catch子句(异常处理程序)看起来就像是接受一个且仅接受一个特殊类型的参数的方法。异常处理程序必须紧跟在try块之后,当异常被抛出时,异常处理机制将负责搜寻参数与异常类型相匹配的第一个处理程序。然后进入catch子句执行,此时认为异常得到了处理。一旦catch子句执行结束,则处理程序的查找过程执行结束。注意,只有匹配的catch子句才能得到执行。

​ 使用finally进行清理:对于一些代码,可能会希望无论try块中的异常是否抛出,它们都能得到执行。这通常适用于除内存之外的资源恢复到它们初始状态时,这种需要清理的资源包括:已经打开的文件或网络连接,在屏幕上画的图形,甚至可以是外部世界的某个开关,如下例所示:

public class Switch {
private boolean state = false;
public boolean read() { return state; }
public void on() { state = true; print(this); }
public void off() { state = false; print(this); }
public String toString() { return state ? "on" : "off"; }
}

/**
* 程序的目的是要确保main()结束的时候开关必须是关的,所以在每个try块和异常处理程序的末尾
* 都加入了对sw.off()方法的调用。但也可能有这种情况:异常被抛出,但没被异常处理程序捕获,
* 这时sw.off()就得不到调用。但是有了finally,只要把try块中清理代码移放在一处即可:
*/
public class OnOffSwitch {
private static Switch sw = new Switch();

public static void f() throws OnOffException1,OnOffException2 {}

public static void main(String[] args) {
try {
sw.on();
// Code that can throw exceptions...
f();
sw.off();
} catch(OnOffException1 e) {
System.out.println("OnOffException1");
sw.off();
} catch(OnOffException2 e) {
System.out.println("OnOffException2");
sw.off();
}
}
}

/**
* 这里sw.off()被移到一处,并且保证在任何情况下都能得到执行。
*/
public class WithFinally {
static Switch sw = new Switch();
public static void main(String[] args) {
try {
sw.on();
// Code that can throw exceptions...
OnOffSwitch.f();
} catch(OnOffException1 e) {
System.out.println("OnOffException1");
} catch(OnOffException2 e) {
System.out.println("OnOffException2");
} finally {
sw.off();
}
}
}

异常使用指南

在恰当的级别处理问题。(在知道该如何处理的情况下才捕获异常。)

解决问题并且重新调用产生异常的方法。

进行少许修补,然后绕过异常发生的地方继续执行。

用别的数据进行计算,以代替方法预计会返回的值。

把当前运行环境下能做的事情尽量做完,然后把相同的异常重抛到更高层。

把当前运行环境下能做的事情尽量做完,然后把不同的异常抛到更高层。

终止程序。

进行简化。(如果你的异常模式使问题变得太复杂,那用起来会非常痛苦也很烦人。)

让类库和程序更安全。(这既是在为调试做短期投资,也是在为程序的健壮性做长期投资。)

标签:Java,思想,编程,sw,try,catch,off,异常,public
From: https://www.cnblogs.com/LvJinshuai/p/17003563.html

相关文章