【Java】异常处理-概述【主线学习笔记】


前言

Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。


异常

在Java中,异常是一种用于处理程序运行时错误的机制。当程序出现错误或异常情况时,Java会抛出一个异常对象,这个对象包含了错误的信息和状态。异常值得并不是语法错误或者逻辑错误。

1、抛出机制

在Java中,异常的抛出机制通过创建异常类的对象并使用throw语句来实现。当发生特定的异常情况时,Java会生成对应异常类的实例,并将其抛出。然后程序员可以捕获(catch)到止个异常对象,并处理;如果没有捕获(catch)这个异常对象,那么这个异常对象将会导致程序终止。

例如,假设我们要处理一个可能导致ArithmeticException的除法运算:

public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int result = divide(10, 0); // 可能会抛出异常
            System.out.println("Result: " + result);
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e.getMessage()); // 捕获并处理异常
        }
    }

    public static int divide(int a, int b) {
        return a / b; // 当b为0时抛出ArithmeticException
    }
}

在这个例子中,divide方法在尝试用0进行除法时,会抛出ArithmeticException。在main方法中,try块捕获了这个异常,catch块则处理了它,避免了程序的崩溃。

2、异常体系

在Java异常体系中,Throwable是所有错误和异常的根类,分为两大类:ErrorException

2.1 Throwable

java.lang.Throwable是Java中所有错误和异常的父类。它提供了一些常用方法,帮助开发者处理和调试异常:

  • public void printStackTrace():打印异常的详细信息,包括异常类型、原因和发生位置。这对于调试非常有用,可以帮助开发者快速定位问题。

  • public String getMessage():获取发生异常的详细原因,返回异常的描述信息。

2.2 Error和Exception

Throwable可以分为两类:

  1. Error:表示Java虚拟机无法解决的严重错误,通常是程序无法恢复的错误,如虚拟机错误(OutOfMemoryError)、资源耗尽等。一般不编写针对性的代码进行处理,因为它们通常表示JVM无法正常运行。

    示例:

    // 虚拟机内存溢出错误
    throw new OutOfMemoryError("Java heap space");
    
  2. Exception:表示程序可以捕获并处理的异常。Exception类的子类包括已检查异常(如IOException)和未检查异常(如NullPointerException)。开发者应当捕获和处理这些异常,以确保程序的健壮性。

    示例:

    try {
        // 可能抛出异常的代码
    } catch (IOException e) {
        // 处理IO异常
        e.printStackTrace();
    }
    

在Java程序的执行过程中,异常可以根据发生的阶段分为两类:编译时期异常和运行时期异常。

2.3 编译时期异常(Checked Exceptions)

  • 定义:在代码编译阶段,编译器能够检测到可能发生的异常,并要求程序员处理这些异常。如果程序员未处理,编译器会直接报错,无法生成字节码文件。
  • 特点
    • 编译器会发出警告,提示程序员必须处理。
    • 通常是由于外部条件引起的,例如文件操作等。
  • 示例FileNotFoundExceptionIOException等。
import java.io.FileReader;
import java.io.IOException;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            FileReader fr = new FileReader("nonexistentfile.txt");
        } catch (IOException e) {
            e.printStackTrace(); // 处理异常
        }
    }
}

2.4 运行时期异常(Unchecked Exceptions)

  • 定义:这些异常在编译阶段不会被检查,编译器不会给出任何提示,只有在代码运行时才会出现。
  • 特点
    • 由程序员的代码错误引起,通常可以通过适当的判断和检查来避免。
    • 继承自java.lang.RuntimeException及其子类。
  • 示例ArrayIndexOutOfBoundsExceptionNullPointerExceptionClassCastException等。
public class UncheckedExceptionExample {
    public static void main(String[] args) {
        int[] array = {1, 2, 3};
        try {
            System.out.println(array[3]); // 可能抛出ArrayIndexOutOfBoundsException
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace(); // 处理异常
        }
    }
}

常见异常

编译时期异常(Checked Exceptions)

  1. IOException:发生输入/输出操作失败或被中断时抛出。
  2. FileNotFoundException:当试图打开一个不存在的文件时抛出。
  3. SQLException:与数据库操作相关的错误。
  4. ClassNotFoundException:当试图加载一个不存在的类时抛出。
  5. ParseException:在解析字符串到日期或数字时失败。

运行时期异常(Unchecked Exceptions)

  1. NullPointerException:当试图访问一个空对象的属性或方法时抛出。
  2. ArrayIndexOutOfBoundsException:当访问数组时使用了非法的索引(例如,超出范围)时抛出。
  3. ArithmeticException:在进行算术运算时出现错误,如除以零。
  4. ClassCastException:尝试将对象强制转换为不兼容的类型时抛出。
  5. IllegalArgumentException:传递给方法的参数不合法时抛出。
  6. NumberFormatException:将字符串转换为数字时发生格式错误时抛出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虫本初阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值