package course.exception; /** * @author WanJl * @version 1.0 * @title Demo01 * @description Java异常 * @create 2026/7/28 */ public class Demo01 { /* 异常 就是程序出现不正常的情况 Java中的异常体系结构: Throwable: 是Java中所有的异常类(Exception)和错误类(Error)的父类, 只有是它的对象或它的子类的对象,才可以别Java虚拟机进行处理(抛出、捕获处理)。 |- Exception:Java中所有异常类的父类 |- 编译器异常 也就是在项目开发的时候,编译的时候就会报错。 |- 运行时异常 也就是说代码不会报错,但是运行后会报错。所有的运行时异常都有一个父类 RuntimeException |- Error:Java中所有错误类的父类 只有Java异常也就是Exception类或其子类,才可以别我们捕获处理或抛出,才可以处理。 至于Error这种错误,是内存级别的,不是我们可以捕获抛出的。需要改代码。 public void method(){ //无条件的递归,一定会引发栈溢出StackOverflowError错误 method(); } Throwable |- Exception |- RuntimeException |-...... |-..... |- Error |-..... Error 是属于严重问题,通常代码都无法处理。一般比如内存错误 Exception: 异常类,表示程序本身可以处理的问题。 RuntimeException以及其子类,属于运行时异常,比如空指针异常,数组索引下标越界异常,除零异常 除了RuntimeException以及其子类之外的所有异常,都是在编译期必须要处理的,否则程序不能通过编译 javac.exe java.exe Java文件(源代码).java ---编译---> 字节码文件 .class ---解释---> 运行结果 编译期 | 运行期 所谓的编译期异常,就是在Java源代码编译成字节码的过程中出现异常类,需要处理(捕获/抛出) 所谓的运行期异常,就是在编译的阶段没有任何错误,但是在从字节码文件解释运行的获取运行结果的期间出现的错误,导致程序不能正常执行。 Java虚拟机JVM 它会怎么处理异常? 如果程序出了问题,我们不做任何处理的话,最终会由JVM做默认的处理,处理的步骤: 1、把异常的名称、错误原因、以及异常出现的位置等信息输出在控制台 2、程序停止运行 我们处理异常的方式也分为两种: 1、我们自己捕获异常,并且处理异常。 格式: try{ 可能出现异常的代码 }catch(异常类型1 变量名){ 异常类型1的处理方式 }catch(异常类型2 变量名){ 异常类型2的处理方式 }catch(异常类型n 变量名){ 异常类型n的处理方式 } 我们处理异常,其实在开发场景下,怎么处理不太重要,能处理就处理了,处理不了也有让程序能够继续运行,才是最重要的。 程序出现异常但能够处理或能够正常运行,体现的是程序的 鲁棒性(健壮性) 兜住异常,给开发人员发邮件 2、我们不处理异常,交给调用者去处理,比如写了一个方法,里面会有编译期异常,我们不处理,只抛出。 谁调用了这个方法,谁去处理,他如果不处理也继续抛出,直到最终抛给JVM,JVM进行默认的处理。 */ public static void main(String[] args) { int a=0; int[]arr; try { //这里面是可能出现异常的情况 //a = 10 / 0; arr= new int[]{}; arr[3]=5; System.out.println("55555555555555555"); }catch (ArithmeticException e){ System.out.println("不能除以0"); System.out.println("以及一些其他的异常处理操作....."); System.out.println(e.getMessage()); }catch (RuntimeException e){ System.out.println("出现了运行时异常"); System.out.println("输出的异常信息:"+e.getMessage()); System.out.println("输出完整的异常信息:"+e.fillInStackTrace()); System.out.println(e.getCause()); }catch (Exception e){ System.out.println("出现了异常..但不是运行时异常"); System.out.println(e.getMessage()); } System.out.println(a); //这种,代码写的时候不报错,但是运行后报错的,就是运行时异常 System.out.println("........后续的代码正在运行................"); } }