JavaException Handling -java异常处理

    xiaoxiao2023-03-24  5

    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(); } } }

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

    前文提供过这些概念,受检异常是受java编译检查的异常,受检异常如果没被处理,编译器会报错。Throwable和Exception类及其子类都是受检异常。受检异常必须遵守Catch or Declare Rule ,要么处理,要么继续向上层调用栈抛出此异常。 受检异常必须try catch 或者throws关键字处理。 非受检异常是不受java编译器检查的异常,也被称之为运行时异常。从RuntimeException 和Error继承的子类都是非受检查异常。 异常体系中受检异常与非受检异常:深颜色的代表受检异常,浅颜色的代表非受检异常。 图来源: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)

    转载请注明原文地址: https://ju.6miu.com/read-1201375.html
    最新回复(0)