【Java基础】Java中异常分类,他们之间的区别?

发布时间:2023年12月26日

在这里插入图片描述


🍁Java中异常类


Java中的异常,主要可以分为两大类,即受检异常 (checked exception)和非受检异常 (unchecked exception)。


🍁受检异常


对于受检异常来说,如果一个方法在声明的过程中证明了其要有受检异常抛出:


public void test() throws Exception{
}


那么,当我们在程序中调用他的时候,一定要对该异常进行处理(捕获或者向上抛出),否则是无法编译通过的这是一种强制规范。


这种异常在 IO 操作中比较多。比如FileNotFoundException ,当我们使用 IO 流处理一个文件的时候,有一种特殊情况,就是文件不存在,所以,在文件处理的接口定义时他会显示抛出 FileNotFoundException,其目的就是告诉这个方法的调用者,我这个方法不保证一定可以成功,是有可能找不到对应的文件的,你要明确的对这种情况做特殊处理。


所以说,当我们希望我们的方法调用者,明确的处理一些特殊情况的时候,就应该使用受检异常。


看一段受检异常的demo:


import java.io.File;  
import java.io.FileNotFoundException;  
import java.util.Scanner;  
  
public class Main {  
    public static void main(String[] args) {  
        try {  
            // 尝试打开文件  
            File myFile = new File("myFile.txt");  
            Scanner myReader = new Scanner(myFile);  
              
            // 读取文件内容  
            while (myReader.hasNextLine()) {  
                String line = myReader.nextLine();  
                System.out.println(line);  
            }  
              
            // 关闭文件  
            myReader.close();  
        } catch (FileNotFoundException e) {  
            // 处理文件未找到异常  
            System.out.println("An error occurred: File not found.");  
            e.printStackTrace();  
        } catch (Exception e) {  
            // 处理其他异常  
            System.out.println("An error occurred: " + e.getMessage());  
            e.printStackTrace();  
        } finally {  
            // 确保文件被关闭,无论是否发生异常  
            try {  
                if (myReader != null) {  
                    myReader.close();  
                }  
            } catch (Exception e) {  
                System.out.println("An error occurred while closing the file.");  
                e.printStackTrace();  
            }  
        }  
    }  
}

在这个例子中,我们尝试打开一个文件并读取其内容。如果文件不存在,我们会捕获 FileNotFoundException 异常并打印出错误消息和堆栈跟踪。我们还添加了一个 finally 块来确保文件在程序结束时被关闭,无论是否发生异常。如果在关闭文件时发生异常,我们也会捕获并打印它。


🍁非受检异常


对于非受检异常来说,一般是运行时异常,继承自 RuntimeException。在编写代码的时候,不需要显示的捕获但是如果不捕获,在运行期如果发生异常就会中断程序的执行。


这种异常一般可以理解为是代码原因导致的。比如发生空指针、数组越界等。所以,只要代码写的没问题,这些异常都是可以避免的。也就不需要我们显示的进行外理。


试想一下,如果你要对所有可能发生空指针的地方做异常处理的话,那相当于你的所有代码都需要做这件事。看一个Demo:


public class Main {  
    public static void main(String[] args) {  
        try {  
            // 尝试执行可能抛出非受检异常的代码  
            int[] arr = new int[5];  
            arr[10] = 100; // 数组越界异常  
              
            // 尝试进行除法运算,可能会抛出除以零异常  
            int result = 10 / 0;  
              
            // 尝试访问一个不存在的数组元素,可能会抛出数组越界异常  
            System.out.println(arr[15]);  
        } catch (Exception e) {  
            // 捕获所有类型的异常并处理  
            System.out.println("An error occurred: " + e.getMessage());  
            e.printStackTrace();  
        } finally {  
            // 在程序结束前执行的代码,确保资源被正确释放  
            System.out.println("Cleaning up resources...");  
        }  
    }  
}

Demo中,尝试执行可能会抛出非受检异常的代码。我们执行了一个数组越界操作和除以零操作,以及访问一个不存在的数组元素。在 catch 块中,我们捕获了所有类型的异常并打印出错误消息和堆栈跟踪。我们还添加了一个 finally 块来确保在程序结束前执行一些清理操作。


🍁拓展知识仓

🍁什么是Throwable


在Java中,Throwable 是一个所有异常和错误的超级类。异常和错误都是可以抛出(throw)的异常对象,可以被捕获(catch)并处理。Throwable 包含两个主要子类:ExceptionError

  • Exception:这是程序运行期间可能出现的异常的超类。大多数运行时异常都是从 Exception 类派生的。
  • Error:这是程序无法处理的严重问题,如 OutOfMemoryErrorStackOverflowError

以下是一个简单的Java代码示例,演示了如何使用 Throwable

public class ThrowableExample {
    public static void main(String[] args) {
        try {
            // 抛出一个异常
            throw new Exception("This is an exception.");
        } catch (Exception e) {
            // 捕获并处理异常
            System.out.println("Caught an exception: " + e.getMessage());
        }
    }
}

在这个例子中,我们创建了一个新的 Exception 对象并抛出它。然后,我们使用 try-catch 块捕获并处理这个异常。这个异常对象就是 Throwable 类型的实例。我们可以通过调用 getMessage() 方法获取异常的详细信息。


🍁Error和Exception的区别和联系


error表示系统级的错误,是java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是Java虚拟机抛出的。如OutOfMemoryError、StackOverflowError这两种常见的错误都是ERROR。


exception 表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须外理的问题.分为RuntimeException和其他异常。


🍁 列举几个常用的RuntimeException


这个题目,其实面试官考的还挺多的,主要是考察面试者实战经验是否丰富,所以常见的RuntimeException要能回答的尽量多回答一些:


在这里插入图片描述

🍁Java异常处理相关的几个关键字,以及简单用法


throws、 throw、try、catch、 finally


1.try用来指定一块预防所有异常的程序
2.catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型
3.finally为确保一段代码不管发生什么异常状况都要被执行
4.throw语句用来明确地抛出一个异常
5.throws用来声明一个方法可能抛出的各种异常

🍁什么是自定义异常,如何使用自定义异常?


自定义异常就是开发人员自己定义的异常,一般通过继承Exception的子类的方式实现。


编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程。


这种用法在Web开发中也比较常见,一般可以用来自定义业务异常。如余额不足、重复提交等。这种自定义异常有业务含义,更容易让上层理解和处理。

文章来源:https://blog.csdn.net/Java_Yangxiaoyuan/article/details/135213129
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。