Java Exception Handling -java异常处理

Java  Exception Handling -java异常处理


java中的异常

异常是程序在编译时或者运行时出现的意想不到的场景,比如在书写java代码时候不遵守java语法规则会导致编译失败,操作数组,下标越界的运行时异常等等。当异常发生时会导致程序异常退出,为了避免程序异常退出,我们必须对出现的某些异常处理,让程序继续执行下去,俗称“异常恢复”。

java中异常的出现

            异常的出现一般有以下情况:
  • throw 自定义异常
  • 代码在异常场景下执行抛出的异常,如数组越界异常、IOException, ArithmeticException, SocketException等等。
  • JVM本身在运行时抛出的异常,比如内存溢出异常等等。这类异常称之为异步异常,我们程序不可能处理它。


java异常处理

 当程序运行时出现异常的时候,我们对异常现象的捕获并试图让程序继续运行的过程,我们称之为异常处理。异常处理改变了程序的执行流程,即当程序出现异常时,即A计划执行失败,我们就执行备用B计划,使得业务继续。

哪些异常我们可以处理

   运行时出现的某些异常,即使我们处理,也不能让程序恢复,比如之前的异步异常,内存溢出错误等。Error类异常是不能让程序继续执行的,Exception类我们可以捕获,处理异常情况,使得程序继续执行。我们一般不会捕获Error异常,而是捕获Exception异常

异常处理关键字

  • try 块
  • catch 块
  • finally 块
  • throw关键字
  • throws关键字
  • Try-with-Resources 


java异常继承关系




java中比较重要的也是最基础的异常类有Throwable,Error,Exception和RuntimeException。
Throwable类是所有异常类的父类,它不能直接被我们抛出,而且是受编译器检查的-受检异常(compiler checked )。 

Error类是Throwable的子类,代表了不可恢复的所有异常。当出现了Error异常时候,即使我们对他们进行异常处理,程序也会异常退出。Error类及其子类也被称之为异步异常。Error类不受编译器检查的-非受检异常

Exception类是Throwable的子类,Exception类及其子类是可恢复异常Exception是受编译器检查的-受检异常

       RuntimeException类是Exception的子类,它及它的子类不受编译器检查的-非受检异常。一般情况下,RuntimeException可以在程序中避免,比如NullPointerException, ArithmeticException, ArrayIndexOutOfBoundException等,我们在异常发生之前可以用代码判断,从而避免异常的出现。


异常的生命周期

     当异常发生时,如果程序没有处理,异常就会从当前栈一直往栈顶方向抛出,去寻找异常处理程序,如果没找到,最终就会被JVM停止程序执行处理,并且stack trace  会默认有system.err输出。
如果你要保存异常堆栈信息,我们可以设置默认异常处理handler:

Thread.setDefaultUncaughtExceptionHandler((thread, ex) -> {
Record the exception
})
   当我们catch了异常时,我们一般不会忽略异常即catch块是空的,最起码你得必须打印出异常堆栈信息:

try {
Class<?> cl = Class.forName(className);
…
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}

   如果你要保存堆栈信息,可以把异常堆栈信息转换成字符串:
ByteArrayOutputStream out = new ByteArrayOutputStream();
ex.printStackTrace(out);
String description = out.toString();

如果要细致的分析堆栈,我们可以用:

StackTraceElement[] frames = ex.getStackTrace();

     得到  StackTraceElement实例来具体分析,具体api参考javadoc。


package com.doctor.commons;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;

import com.doctor.beaver.annotation.ThreadSafe;

/**
 * @author sdcuike
 *         <p>
 *         Created on 2016年9月27日<br/>
 */
@ThreadSafe
public final class ExceptionUtils {

    public static String printStackTraceToString(final Throwable t) throws IOException {
        try (StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);) {
            t.printStackTrace(pw);
            pw.flush();
            sw.flush();
            return sw.toString();
        }
    }

    public static String printFullStackTraceToString(final Throwable t) throws IOException {
        try (StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);) {
            Throwable caseT = t;
            while (caseT != null) {
                caseT.printStackTrace(pw);
                caseT = caseT.getCause();
            }
            pw.flush();
            sw.flush();
            return sw.toString();
        }
    }

}




Java Exception Handling -java异常处理_第1张图片

Checked and Unchecked Exception-受检异常和非受检异常

前文提供过这些概念,受检异常是受java编译检查的异常,受检异常如果没被处理,编译器会报错。Throwable和Exception类及其子类都是受检异常。受检异常必须遵守Catch or Declare Rule ,要么处理,要么继续向上层调用栈抛出此异常。
受检异常必须try catch 或者throws关键字处理。
非受检异常是不受java编译器检查的异常,也被称之为运行时异常。从RuntimeException 和Error继承的子类都是非受检查异常。

异常体系中受检异常与非受检异常:深颜色的代表受检异常,浅颜色的代表非受检异常。
Java Exception Handling -java异常处理_第2张图片
图来源:absolute java ™ 6th edition  
                ----Walter Savitch  © Pearson Education Limited 2016

方法重载异常处理规则

父类方法没有throws任何异常时,子类不能throws受检异常,但可以throws非受检异常。

父类方法throws异常时,子类不必throws任何异常,或者throws的异常必须是同类型或者子类(即删除或替换异常规则)。

ErrorRuntimeException 类及其他们的子类应该不出现在throws列表中。



参考:http://www.tutorialspoint.com/java/java_exceptions.htm

http://tutorials.jenkov.com/java-exception-handling/index.html

http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html

http://www.javaworld.com/article/2076700/core-java/exceptions-in-java.html

Java 8 Exception Handling Develop Reliable Java Applications (Black Book Series) - Mahavir DS Rathore

(https://yunpan.cn/ckzJdHGh8I78b  访问密码 e580)

你可能感兴趣的:(java,exception,java异常处理,hand)