Java基础-异常

发布时间:2024年01月18日

什么是异常

如果一个方法不能通过正常的路径完成任务的话,它可以通过另一种路径去结束这个方法.
然后抛出一个封装错误信息的对象,同时这个方法立刻退出并且不返回任何值.
另外,调用这个方法的其他代码也不会继续执行,异常处理机制会将代码执行交给异常处理器.

异常分类

在这里插入图片描述

Throwable它是Java语言中所有错误或者异常的超类.
它的下一层为Error和Exception.
为什么这么分呢
主要是在于它们所表示的问题类型以及程序处理问题方式.

Error
问题类型:指Java运行时系统的内部错误和资源耗尽错误.应用程序并不会抛出该类对象.
处理方式:主要是由Java虚拟机负责的,因为它们通常表示严重的问题如果出现该类情况,告知用户,剩下的就是尽力让程序安全的终止.

Exception

  • 受检异常

问题类型:编译时需要处理的异常
处理方式:需要通过try-catch块或者向上抛出throws来处理的异常.一般编译器会强制去捕获此类异常

举例子
一般包括几个方面:

  1. 想在文件尾部读取数据
  2. 想打开一个错误格式的URL
  3. 想根据字符串查找Class对象,而这个字符串表示的类不存在
public class CheckedExceptionExample {
    public static void main(String[] args) throws IOException {
        // 1. 想在文件尾部读取数据
        try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (FileNotFoundException e) {
            System.out.println("File not found: " + e.getMessage());
        }

        // 2. 想打开一个错误格式的URL
        try {
            new URL("some invalid url");
        } catch (MalformedURLException e) {
            System.out.println("Malformed URL: " + e.getMessage());
        }

        // 3. 想根据字符串查找Class对象,而这个字符串表示的类不存在
        try {
            Class.forName("some.invalid.Class");
        } catch (ClassNotFoundException e) {
            System.out.println("Class not found: " + e.getMessage());
        }
    }
}

  • 非受检异常
    问题类型: 开发时出现的异常和错误,通常是由程序逻辑引起的.
    处理方式:这些异常不需要显示进行处理,我们可以选择捕获并处理它们.

自定义非受检异常:
自定义非检查异常只需要继承 RuntimeException 即可.

举例

  1. 空指针异常
  2. 栈溢出
public class UncheckedExceptionExample {
    public static void main(String[] args) {
        // 1. 空指针异常
        String str = null;
        try {
            System.out.println(str.length());
        } catch (NullPointerException e) {
            System.out.println("NullPointerException caught: " + e.getMessage());
        }

        // 2. - 例如 StackOverflowError
        try {
            recursiveMethod(0);
        } catch (StackOverflowError e) {
            System.out.println("StackOverflowError caught: " + e.getMessage());
        }
    }

    private static void recursiveMethod(int i) {
        System.out.println("Recursive method called: " + i);
        recursiveMethod(i + 1);
    }
}

自定义非受检异常
在这里插入图片描述

异常的处理方式

有两种处理方式:

  • 遇到问题不具体处理,而是抛出给调用者
    抛出异常有三种方式
  1. throw
  2. throws
  3. 系统自动抛异常
    举例子
public static void main(String[] args) { 
 String s = "abc"; 
 if(s.equals("abc")) { 
 throw new NumberFormatException(); 
 } else { 
 System.out.println(s); 
 } 
} 
int div(int a,int b) throws Exception{
   return a/b;
}
  • try catch 捕获异常针对性处理方式
    举例子:
public static void main(String[] args) {
        // 1. 空指针异常
        String str = null;
        try {
            System.out.println(str.length());
        } catch (NullPointerException e) {
            System.out.println("NullPointerException caught: " + e.getMessage());
        }
}

我有点好奇,Throw和throws有什么区别呢?

它们主要是位置不同,功能不同

位置不同
throws用在函数上,后面跟的是异常类,可以跟多个;而throw用在函数内,后面跟的是异常对象.
功能不同

  1. throws用来声明异常,让调用者明白功能可能出现的问题,可以给出预先的处理方式;而throw抛出具体的问题对象,执行到throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者.(所以正如上面所提到的,当throw语句独立存在时,下面定义其他语句没有意义,因为执行不到.)
  2. throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象.

它们也有相同的点,它们都是比较消极的处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理.

====先发布,明天继续填坑

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