秦疆的Java课程笔记:77 异常 Error和Exception

发布时间 2023-12-19 16:39:22作者: Acolyte_9527
  • 实际工作中,遇到的情况不可能非常完美。比如:写好的某个模块,用户输入不一定符合要求;程序要打开某个文件,但这个文件可能不存在或者格式不对;你要读取数据库的数据,数据可能是空的;程序在跑着,内存或者硬盘满了……等等情况。
  • 软件程序在运行过程中,这类例外情况,通称“异常”,英文:Exception,意思是例外。
  • 写程序要对异常做出合理处理,不至于程序崩溃。
  • 一些定义:
    • 异常制程序运行中出现的不期而至的各种状况。
    • 异常发生在程序运行期间,影响正常的程序执行流程。

  • 一个简单的循环调用(这是个比较严重的Error)
public class Demo1 {  
    public static void main(String[] args) {  
        new Demo1().a();  
    }  
    public void a() {  
        b();  
    }  
    public void b() {  
        a();  
    }  
}
====运行报错====
Exception in thread "main" java.lang.StackOverflowError
  • 又比如常见的除数为零
public class Demo2 {  
    public static void main(String[] args) {  
        System.out.println(11/0);  
    }  
}
====运行报错====
Exception in thread "main" java.lang.ArithmeticException: / by zero

  • 软件公司常有“测试”岗位,专门负责找bug,测试在某些情况下出现特定的问题。
  • 要理解Java异常处理是如何工作的,需要掌握以下三种异常类型:
    • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
    • 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常想相反,运行时异常可以在编译时被忽略。
    • 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译时也检查不到。

  • 异常处理框架的思想:Java把异常当作一个对象处理,并定义一个基类java.lang.Throwable作为所有异常的超类。

  • 在Java API中已经定义了许多异常类,这些异常分为两大类,错误Error和异常Exception。详见:Class Throwable

  • Error类对象Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。

  • Java虚拟机运行错误VirtualMachineError,当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,JVM一般会选择线程终止。

  • 还有发生在JVM试图执行应用时,如:类定义错误NoClassDefFoundError、链接错误LinkageError。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的情况。

  • Exception分支中有一个重要的子类运行时异常RuntimeException。这些异常不是检查异常,程序中可以选择捕获处理,也可以不处理。

    • 数组下标越界ArrayIndexOutOfBoundsException
    • 空指针异常NullPointerException
    • 算数异常ArithmeticException
    • 丢失资源MissingResourceException
    • 找不到类ClassNotFoundException
  • 这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽量避免这类异常的发生

  • Error和Exception的区别:

    • Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这种异常时,JVM一般会终止线程。
    • Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。