异常处理:让你的代码更加健壮与可靠!

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

开篇语

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

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

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

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

前序

在软件开发中,异常是无法避免的,但我们可以通过有效的异常处理来减少它们对程序的影响。Java 提供了强大的异常处理机制,能够帮助我们在发生错误时更好地捕获、处理并给出适当的响应。掌握异常处理是编写健壮、可维护代码的关键。

今天,我们将深入探讨异常处理的各个方面,涵盖异常的类型、如何使用 try-catch-finally 块来捕获异常、如何创建自定义异常、异常链的概念,以及 throwthrows 的区别和使用场景。


前言

你在写代码时,可能会遇到各种各样的异常——比如用户输入错误、数据库连接失败、文件未找到等等。这些异常如果没有正确处理,就会导致程序崩溃。幸运的是,Java提供了异常处理机制,通过 try-catch 等结构来捕获异常并做出相应的处理。今天,我们将深入讲解这些机制,让你能够更好地处理各种异常,避免程序崩溃,并提供更好的用户体验。


第一部分:异常的类型:Checked ExceptionUnchecked Exception

在 Java 中,异常大致可以分为两类:Checked ExceptionUnchecked Exception。这两种异常有不同的处理方式和使用场景。

1.1 Checked Exception(受检异常)

Checked Exception 是在编译时被检查的异常。它们通常是程序无法控制的错误,如文件读取错误、网络连接失败等。Java要求开发者显式地处理这些异常,否则编译器会报错。

常见的 Checked Exception 包括:

  • IOException:输入输出异常(如文件未找到)
  • SQLException:SQL异常(如数据库连接失败)
  • ClassNotFoundException:类未找到异常

示例:

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

public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            File file = new File("nonexistentFile.txt");
            Scanner scanner = new Scanner(file);  // 可能会抛出FileNotFoundException
        } catch (FileNotFoundException e) {
            System.out.println("File not found: " + e.getMessage());
        }
    }
}

解释:

  • 在上面的代码中,Scanner 会抛出 FileNotFoundException,这是一个 Checked Exception,因此我们必须显式地捕获它。

1.2 Unchecked Exception(非受检异常)

Unchecked Exception 是在运行时发生的异常,编译器不要求必须处理它们。它通常是程序逻辑错误导致的异常,如数组越界、空指针等。

常见的 Unchecked Exception 包括:

  • NullPointerException:空指针异常
  • ArrayIndexOutOfBoundsException:数组越界异常
  • ArithmeticException:算数异常(如除以零)

示例:

public class UncheckedExceptionExample {
    public static void main(String[] args) {
        String str = null;
        System.out.println(str.length());  // 可能会抛出NullPointerException
    }
}

解释:

  • 上面的代码会抛出 NullPointerException,这是一个 Unchecked Exception。由于它是运行时异常,编译器不强制要求我们处理它。

第二部分:try-catch-finally

try-catch-finally 块是 Java 异常处理的核心结构,它用于捕获和处理异常。异常发生时,程序会跳到 catch 块进行处理,finally 块无论是否发生异常都会执行,通常用于清理资源。

2.1 try-catch

  • try 块包含可能抛出异常的代码。
  • catch 块用于捕获并处理异常。

示例:

public class TryCatchExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0;  // 可能会抛出ArithmeticException
        } catch (ArithmeticException e) {
            System.out.println("Error: Division by zero!");
        }
    }
}

解释:

  • 代码会抛出 ArithmeticException,并且由 catch 块捕获并处理,避免程序崩溃。

2.2 finally

finally 块用于在 try-catch 结束后执行一些清理工作,无论是否发生异常。常用于关闭文件流、数据库连接等资源释放操作。

示例:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class FinallyExample {
    public static void main(String[] args) {
        FileReader fr = null;
        try {
            fr = new FileReader("file.txt");
            // 可能会抛出IOException
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        } finally {
            if (fr != null) {
                try {
                    fr.close();  // 关闭资源
                    System.out.println("File closed successfully.");
                } catch (IOException e) {
                    System.out.println("Error while closing the file.");
                }
            }
        }
    }
}

解释:

  • finally 块确保无论是否发生异常,都会执行资源关闭操作。

第三部分:异常链与自定义异常

3.1 异常链

异常链(Exception Chaining)是指在一个异常处理过程中,抛出另一个异常,通常是为了在捕获到异常时,保留原始异常信息。Java支持通过构造函数将原始异常作为参数传递给新的异常。

示例:

public class ExceptionChainExample {
    public static void main(String[] args) {
        try {
            try {
                throw new NullPointerException("Null pointer exception");
            } catch (NullPointerException e) {
                throw new RuntimeException("Runtime exception occurred", e);  // 异常链
            }
        } catch (RuntimeException e) {
            e.printStackTrace();
        }
    }
}

解释:

  • 当捕获到 NullPointerException 时,抛出一个新的 RuntimeException,并将原始异常作为参数传递给新的异常。这样可以保留原始异常的栈跟踪信息。

3.2 自定义异常

Java允许我们创建自定义异常类,它们通常继承自 ExceptionRuntimeException 类。自定义异常可以为我们提供更具意义的错误信息。

示例:

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

public class CustomExceptionExample {
    public static void main(String[] args) {
        try {
            int age = -5;
            if (age < 0) {
                throw new InvalidAgeException("Age cannot be negative.");
            }
        } catch (InvalidAgeException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}

解释:

  • InvalidAgeException 是我们自定义的异常类,它继承自 Exception。当年龄小于零时,抛出自定义异常,并打印错误信息。

第四部分:throwthrows的区别与使用

4.1 throw关键字

throw 关键字用于显式抛出一个异常。通常用于在方法中根据某些条件判断是否抛出异常。

示例:

public class ThrowExample {
    public static void main(String[] args) {
        throw new IllegalArgumentException("Illegal argument passed.");
    }
}

解释:

  • throw 用于在代码中显式抛出异常,可以创建一个新的异常实例并抛出。

4.2 throws关键字

throws 关键字用于方法声明中,表示该方法可能会抛出某些异常,调用者需要处理这些异常。与 throw 不同,throws 是声明异常,而不是抛出异常。

示例:

public class ThrowsExample {
    public static void main(String[] args) throws Exception {
        readFile("file.txt");
    }

    public static void readFile(String fileName) throws Exception {
        if (fileName == null) {
            throw new Exception("File name cannot be null");
        }
        System.out.println("Reading file: " + fileName);
    }
}

解释:

  • 在方法 readFile 中声明了 throws Exception,意味着调用者需要处理这个异常。如果调用 readFile 时出现异常,必须使用 try-catch 进行捕获或继续声明抛出。

总结

Java的异常处理机制是非常强大的,能够帮助我们在程序发生异常时及时捕获并处理,避免程序崩溃。通过 try-catch-finally 块、throwthrows 关键字,我们能够在出现错误时采取适当的应对措施。自定义异常和异常链让我们能够提供更具意义的错误信息,帮助调试和定位问题。

掌握异常处理不仅能使你的代码更加健壮和安全,还能提高代码的可维护性和可读性。在实际开发中,合理使用这些机制,能帮助你编写出高质量的代码。

… …

文末

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

… …

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

wished for you successed !!!


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

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


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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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