Java中的异常处理(一)

简介: Java中的异常处理(一)

Java 异常处理



Java 的异常处理是 Java 语言的一大重要特性,也是提高代码健壮性的最强大方法之一。当我们编写了错误的代码时,编译器在编译期间可能会抛出异常,有时候即使编译正常,在运行代码的时候也可能会抛出异常。


目标:


什么是异常


Java 中异常类的架构


如何进行异常处理


如何自定义异常


什么是异常链


如何使用异常链


前言



1.8/25


2.编程不能停,成为运维开发性人才


3.计算机408基础打好,编程语言学精通,然后走下去


4.Docker和K8s继续


1. 什么是异常



异常就是程序上的错误,我们在编写程序的时候经常会产生错误,这些错误划分为编译期间的错误和运行期间的错误。


下面我们来看几个常见的异常案例。


如果语句漏写分号,程序在编译期间就会抛出异常,实例如下:


public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello World!")
    }
}


运行结果:


$ javac Hello.java
Hello.java:3: 错误: 需要';'
        System.out.println("Hello World!")
                                          ^
1 个错误


static 关键字写成了 statci,实例如下:


Hello.java:2: 错误: 需要<标识符>
    public statci void main(String[] args) {
                 ^
1 个错误


当数组下标越界,程序在编译阶段不会发生错误,但在运行时会抛出异常。实例如下:


public class ArrayOutOfIndex {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println(arr[3]);
    }
}


运行结果:


Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
  at ArrayOutOfIndex.main(ArrayOutOfIndex.java:4)


2. Java 异常类架构



在 Java 中,通过 Throwable 及其子类来描述各种不同类型的异常。如下是 Java 异常类的架构图(不是全部,只展示部分类):


image.png


2.1 Throwable 类


Throwable 位于 java.lang 包下,它是 Java 语言中所有错误(Error)和异常(Exception)的父类。


Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。


主要方法:


fillInStackTrace: 用当前的调用栈层次填充 Throwable 对象栈层次,添加到栈层次任何先前信息中;


getMessage:返回关于发生的异常的详细信息。这个消息在 Throwable 类的构造函数中初始化了;


getCause:返回一个 Throwable 对象代表异常原因;


getStackTrace:返回一个包含堆栈层次的数组。下标为 0 的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底;


printStackTrace:打印 toString() 结果和栈层次到 System.err,即错误输出流。


2.2 Error 类


Error 是 Throwable 的一个直接子类,它可以指示合理的应用程序不应该尝试捕获的严重问题。这些错误在应用程序的控制和处理能力之外,编译器不会检查 Error,对于设计合理的应用程序来说,即使发生了错误,本质上也无法通过异常处理来解决其所引起的异常状况。


常见 Error:


AssertionError:断言错误;


VirtualMachineError:虚拟机错误;


UnsupportedClassVersionError:Java 类版本错误;


OutOfMemoryError :内存溢出错误。


2.3 Exception 类


Exception 是 Throwable 的一个直接子类。它指示合理的应用程序可能希望捕获的条件。


Exception 又包括 Unchecked Exception(非检查异常)和 Checked Exception(检查异常)两大类别。


2.3.1 Unchecked Exception (非检查异常)


Unchecked Exception 是编译器不要求强制处理的异常,包含 RuntimeException 以及它的相关子类。我们编写代码时即使不去处理此类异常,程序还是会编译通过。


常见非检查异常:


NullPointerException:空指针异常;


ArithmeticException:算数异常;


ArrayIndexOutOfBoundsException:数组下标越界异常;


ClassCastException:类型转换异常。


2.3.2 Checked Exception(检查异常)


Checked Exception 是编译器要求必须处理的异常,除了 RuntimeException 以及它的子类,都是 Checked Exception 异常。我们在程序编写时就必须处理此类异常,否则程序无法编译通过。


常见检查异常:


IOException:IO 异常


SQLException:SQL 异常


相关文章
|
7天前
|
Java 编译器
Java中的异常处理机制详解
Java中的异常处理机制详解
|
17天前
|
Java 数据库连接 开发者
零失败率!Java中的异常处理技巧
零失败率!Java中的异常处理技巧
|
26天前
|
Java 开发者 UED
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
【6月更文挑战第19天】在Java中,`throws`关键字是异常处理的关键,它提升了方法签名的透明度和代码质量。不使用`throws`时,未捕获的异常可能导致程序崩溃。例如,`readFileContent`方法若不声明`throws IOException`,则隐藏了可能的风险。而明确声明如`throws IOException`,提醒调用者需处理异常,增强代码稳定性。
|
3天前
|
Java 数据库连接 开发者
Java中的异常处理机制与最佳实践
本文旨在深入探讨Java的异常处理机制,揭示异常处理在程序设计中的重要性及其对软件质量的影响。文章将通过案例分析,阐释异常处理的最佳实践,包括自定义异常类的创建、异常链的使用以及如何避免常见的异常处理陷阱。此外,还将讨论如何利用现代Java版本的特性来优化异常处理策略,提升代码的健壮性和可读性。
|
6天前
|
设计模式 Java 开发者
Java中的异常处理与断路器模式
Java中的异常处理与断路器模式
|
12天前
|
Java 编译器
Java中的异常处理机制详解
Java中的异常处理机制详解
|
24天前
|
Java 程序员 API
Java 中的异常处理:从基础到高级
【6月更文挑战第20天】在Java编程的世界中,异常处理扮演着至关重要的角色。它不仅关乎代码的健壮性,还直接影响程序的用户体验。本文将从Java异常处理的基础知识出发,逐步深入到更复杂的场景,如自定义异常、异常链以及如何优化异常处理以提高性能。通过具体示例,我们将探索如何在Java中有效地管理和处理异常,确保应用程序即使在遇到不可预见的错误时也能保持运行。
|
23天前
|
Java 程序员 编译器
Java 异常处理详解(如果想知道Java中有关异常处理的知识点,那么只看这一篇就足够了!)
Java 异常处理详解(如果想知道Java中有关异常处理的知识点,那么只看这一篇就足够了!)
|
26天前
|
Java 开发者 UED
【实战攻略】Java异常处理进阶:throw关键字,打造坚不可摧的错误防御体系!
【6月更文挑战第19天】在Java中,`throw`关键字用于主动抛出异常,特别是在检测到错误条件如非法参数时。通过`throw`,开发者能控制何时中断程序并提供清晰的错误信息。例如,在验证订单金额时,如果金额小于等于零,可以抛出`IllegalArgumentException`。此外,`throw`还可用于构建异常链,保留错误上下文,便于问题追溯。掌握`throw`使用,是构建健壮异常处理和提升用户体验的关键。
|
26天前
|
Java UED 开发者
【技术解密】Java异常处理新玩法:throw关键字,你的错误管理利器!
【6月更文挑战第19天】Java异常处理关键在于`throw`,它用于主动抛出异常,确保程序健壮性。例如,当年龄验证失败时,`IllegalArgumentException`被`throw`,提供错误详情。自定义异常如`CustomException`能增强错误信息。此外,通过构建异常链,如在`DataProcessingException`中嵌套`IOException`,保持原始堆栈信息,提供更全面的错误上下文。掌握`throw`能提升错误管理,打造稳定软件。