你真的了解异常处理吗?遇到错误不慌,学会这些技巧才能游刃有余!

举报
喵手 发表于 2025/09/24 21:13:35 2025/09/24
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在我们日常编程中,错误是不可避免的!它们像“程序中的小魔鬼”,时刻准备跳出来捣乱。但不要担心,亲爱的开发者们,错误虽然可怕,却也可以被掌控。通过良好的异常处理,我们不仅能保证程序的稳定性,还能让用户体验更加友好。

在这篇文章中,我们将带你深入了解异常的概念与分类,掌握如何使用try-catch-finally块来捕捉并处理异常,同时了解自定义异常以及异常链的神奇世界。看完这篇文章,你再也不用担心代码中的“错误小怪兽”啦!


目录:

  1. 异常的概念与分类(Checked、Unchecked)
  2. try-catch-finally块
  3. 自定义异常
  4. 异常链与堆栈跟踪

1. 异常的概念与分类(Checked、Unchecked)

在程序运行过程中,可能会发生各种错误,比如输入不合法、资源不可用、数据处理异常等。这些错误通常被称为异常。但是,异常并不是一种“坏事”,它反而是程序的一种正常现象——它帮助我们发现问题并加以处理。

1.1 Checked 异常

所谓的Checked异常,是指那些在编译时就能检测到的异常。它们通常是由于外部因素(比如文件读写、网络连接、数据库操作等)导致的。对于这种类型的异常,Java编译器要求你在代码中显式地进行异常处理,否则会报错。

例如,文件操作时,如果文件不存在,就会抛出FileNotFoundException,这是一个典型的Checked异常。我们必须要使用try-catch语句捕捉并处理。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class CheckedExceptionDemo {
    public static void main(String[] args) {
        try {
            File file = new File("nonexistentfile.txt");
            Scanner scanner = new Scanner(file);
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到!请检查路径是否正确。");
        }
    }
}

1.2 Unchecked 异常

与Checked异常相对的,是Unchecked异常,这些异常一般是在程序运行时出现的错误,如数组下标越界、空指针访问等。它们通常继承自RuntimeException类。虽然Unchecked异常也是错误,但编译器并不强制要求我们在代码中进行显式的异常处理,程序在运行时出现这些异常时会直接抛出。

比如下面这个例子,数组越界就是一个常见的Unchecked异常:

public class UncheckedExceptionDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println(arr[5]); // 这里会抛出ArrayIndexOutOfBoundsException异常
    }
}

2. try-catch-finally块

接下来,我们来聊聊异常处理的常见工具——try-catch-finally块。通过这个结构,我们可以捕捉程序中的异常并处理它,让程序在面对异常时不至于崩溃。

2.1 try块

try块用于包裹可能发生异常的代码。如果代码中出现了异常,程序会跳出当前try块并进入catch块。

try {
    int result = 10 / 0;  // 这里会抛出ArithmeticException
} catch (ArithmeticException e) {
    System.out.println("除数不能为零!");
}

2.2 catch块

catch块用于捕捉try块中抛出的异常,并处理它。可以有多个catch块来处理不同类型的异常。

try {
    String s = null;
    System.out.println(s.length()); // 会抛出NullPointerException
} catch (NullPointerException e) {
    System.out.println("不能对空对象调用方法!");
}

2.3 finally块

finally块是在try-catch语句之后执行的,不管是否发生异常,finally块中的代码都会执行。通常,finally块用于释放资源,比如关闭文件流、数据库连接等。

public class FinallyDemo {
    public static void main(String[] args) {
        try {
            int[] arr = {1, 2};
            System.out.println(arr[3]); // 这里会抛出ArrayIndexOutOfBoundsException
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组下标越界!");
        } finally {
            System.out.println("执行完毕,清理资源!");
        }
    }
}

3. 自定义异常

有时,程序中会出现一些业务相关的异常,这些异常是系统默认的异常类无法满足的。这个时候,你就可以自定义异常类。自定义异常类需要继承自Exception(或者RuntimeException,如果你想要它是Checked异常或Unchecked异常)。

3.1 自定义Checked异常

class InvalidAgeException extends Exception {
    public InvalidAgeException(String message) {
        super(message);
    }
}

public class CustomCheckedExceptionDemo {
    public static void main(String[] args) {
        try {
            throw new InvalidAgeException("年龄不能小于18岁!");
        } catch (InvalidAgeException e) {
            System.out.println(e.getMessage());
        }
    }
}

3.2 自定义Unchecked异常

class NegativeValueException extends RuntimeException {
    public NegativeValueException(String message) {
        super(message);
    }
}

public class CustomUncheckedExceptionDemo {
    public static void main(String[] args) {
        throw new NegativeValueException("不能传递负值!");
    }
}

4. 异常链与堆栈跟踪

在复杂的程序中,异常可能会在多个层次传递,我们称这种现象为异常链。通过异常链,我们可以追踪异常发生的根源,便于调试和定位问题。

4.1 异常链

Java允许将一个异常作为另一个异常的原因(通过Throwable类的构造方法传递),从而形成异常链。通过这种方式,我们可以捕捉到多个层次的异常信息。

public class ExceptionChainDemo {
    public static void main(String[] args) {
        try {
            try {
                throw new IllegalArgumentException("参数无效");
            } catch (IllegalArgumentException e) {
                throw new RuntimeException("运行时异常", e); // 抛出新的异常,并将原始异常作为原因
            }
        } catch (RuntimeException e) {
            System.out.println("捕获到异常:" + e.getMessage());
            e.printStackTrace();  // 打印堆栈跟踪
        }
    }
}

4.2 堆栈跟踪

堆栈跟踪(stack trace)是异常发生时,系统自动记录的调用链信息。它展示了异常发生的具体位置以及异常传播的路径。通过堆栈跟踪,你可以轻松定位问题所在。

try {
    int[] arr = {1};
    System.out.println(arr[2]);  // 这会抛出数组下标越界异常
} catch (Exception e) {
    e.printStackTrace();  // 打印堆栈跟踪
}

总结

异常处理是程序设计中非常重要的一部分,掌握了正确的异常处理技巧,不仅能让你的代码更健壮,还能让你在面对bug时更加从容不迫。通过合理使用try-catch-finally块,灵活自定义异常,善用异常链与堆栈跟踪,你会发现编写稳定、可维护的代码其实是很有趣的事。

所以,下次当你遇到异常时,记得要冷静对待,运用这些技巧,像个编程高手一样轻松解决问题!🚀

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。