?
何谓Java异常,阻止当前方法或作用域继续执行的问题。
?
Java的异常体系:Throwable是Java语言中所有错误或异常的超类(包含一切可抛的东西)。他有两个子类,Error和Exception。
?
Error:用于指示合理的程序不应该试图捕获的严重问题。比如说VirtualMachineError,当JVM崩溃或用尽了他继续操作所需的资源,抛出该错误。
?
Exception:分为两大类--
Runtime Exception(也叫Checked Exception)
Unchecked Exception(非Runtime Exception)
?
异常处理方法:
处理方式1:将异常捕获try...catch
处理方式2:将异常继续向外抛出
?
异常的使用
? ?Case 1:
try { // 可能发生异常的代码 // 如果发生了异常,那么异常之后的代码都不会被执行 } catch (Exception e) { // 异常处理代码 } finally { // 不管有没有发生异常,finally语句块都会被执行 }
?
? Case 2: 重新抛出异常
? ? ? 原封不动的把这个异常抛给上一级,抛给调用这个方法的人,让他伤脑筋去吧。
?
? Case 3:异常链的使用及丢失
? ? ?为了避免异常链丢失,可在抛出异常前,调用initCause()初始化改异常的原因,这样在调用e.printStackTrace()时,会将上一层的异常也打印出来。
? ? ? ? 如: e.initCause(a);
?
? Case 4: 清理工作
? ? ? 如果一些消耗资源的操作,如IO、JDBC,用完之后没有及时正确的关闭,那后果会很严重,意味着内存的泄露。
public void readFile() { BufferedReader reader = null; try { try { reader = new BufferedReader(new InputStreamReader( new FileInputStream("file"))); // do some other work // close reader } finally { reader.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
?
? Case 5: 异常的误用
? ? ? 有些人喜欢直接用一个Exception来捕捉所有的异常,这是其实是最傻最二的方法了,根本无法分清是由什么引起的异常。
? ? ? 异常时程序处理意外情况的机制,当程序发生意外时,我们需要尽可能多的得到意外的信息,包括发生的位置,描述,原因等等。这些都是我们解决问题的线索。如果我们自己写代码,应尽可能多的对这个异常进行描述,比如说为什么会出现这个异常,什么情况下发生这个异常。如果传入方法的参数不正确,告知什么样的参数是合法的参数,或者给出一个Sample。
? ? ? 还有一点,应将try block写的简短,不要将所有的东西都扔在这里。尽可能分析出是哪几行代码可能出现异常,只对可能出现异常的代码进行catch。尽量为每一个异常都写一个try...catch,避免异常丢失。因为一个try后面的多个catch中,最多只会有一个catch块被执行。
?
Case 6:try块中有return语句时, 仍然会首先执行finally块中的语句,然后方法返回。
? ? ? ? ? ? ? 如果try块中存在System.exit(0)语句,那么就不会执行finally块中的代码,因为System.exit(0)会终止当前运行的JVM,程序会在JVM终止前结束执行。
原文:http://tummyling.iteye.com/blog/2179351