首页 > 编程语言 >Java中的常见异常

Java中的常见异常

时间:2023-09-18 22:31:51浏览次数:31  
标签:Java 处理 代码 常见 try catch new 异常

Java语言中包含了许多内置异常,这些异常可以分为两大类:检查型异常(Checked Exceptions)和非检查型异常(Unchecked Exceptions)。检查型异常是在编译时必须被处理的异常,如IOException、ClassNotFoundException等。非检查型异常是运行时异常,如NullPointerException、ArrayIndexOutOfBoundsException等。 Snipaste_2023-09-18_22-22-18.png 一、检查型异常

  1. IOException:该异常表示输入/输出操作失败或中断,例如读取文件时文件不存在。处理该异常通常需要在代码中使用try-catch块。

示例代码:

try {
    File file = new File("nonexistent.txt");
    FileReader fr = new FileReader(file);
} catch (IOException e) {
    e.printStackTrace();
}
  1. ClassNotFoundException:该异常表示在运行时找不到指定的类。通常是因为在代码中使用了不存在的类或者类路径不正确。

示例代码:

try {
    Class.forName("nonexistent.class");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

二、非检查型异常

  1. NullPointerException:该异常表示在代码中使用了空引用对象。通常是因为对象没有被正确初始化或者引用了不存在的对象。

示例代码:

String str = null;
System.out.println(str.length()); // 抛出NullPointerException异常
  1. ArrayIndexOutOfBoundsException:该异常表示在访问数组时,指定的索引超出了数组的范围。通常是因为在代码中使用了不合法的索引值。

示例代码:

int[] arr = new int[5];
System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException异常

三、自定义异常

除了Java内置的异常,我们还可以自定义异常来处理特定的错误情况。自定义异常需要继承Exception类或其子类,并在代码中抛出该异常对象。

示例代码:

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

public class Main {
    public static void main(String[] args) {
        try {
            throw new MyException("MyException occurred");
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我们自定义了一个MyException异常,并在代码中抛出该异常对象。在try-catch块中捕获该异常并输出异常信息。

四、异常处理最佳实践

  1. 在代码中捕获异常时,应该尽可能精确地指定异常类型,避免捕获所有异常类型。这样可以减少不必要的try-catch块,提高代码的可读性和可维护性。
  2. 在处理异常时,应该避免在catch块中使用空的异常处理程序。这样会导致异常信息被丢失,无法及时发现问题。应该至少输出异常信息或进行适当的处理。 Snipaste_2023-09-18_22-22-41.png
  3. 在抛出自定义异常时,应该提供有意义的异常信息,方便开发人员定位问题并进行调试。
  4. 在进行异常处理时,应该注意避免在处理异常的过程中再次抛出相同的异常。这会使问题无法得到解决,可能导致程序的崩溃。

下面是一个例子,说明了如何避免在处理异常的过程中再次抛出相同的异常:

public void readFile(String filename) {
    try {
        File file = new File(filename);
        FileReader fr = new FileReader(file);
        // 处理文件读取异常
        try {
            BufferedReader br = new BufferedReader(fr);
            // 读取文件内容
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();  // 处理可能的IO异常
        } finally {
            if (br != null) {
                try {
                    br.close();  // 关闭BufferedReader
                } catch (IOException e) {
                    e.printStackTrace();  // 处理关闭BufferedReader时的IO异常
                }
            }
            if (fr != null) {
                try {
                    fr.close();  // 关闭FileReader
                } catch (IOException e) {
                    e.printStackTrace();  // 处理关闭FileReader时的IO异常
                }
            }
        }
    } catch (FileNotFoundException e) {
        System.out.println("文件不存在:" + filename);  // 处理文件未找到异常
    }
}

在这个例子中,我们打开一个文件并尝试读取其内容。如果在这个过程中出现任何IO异常,我们会在catch块中捕获它并打印出异常堆栈信息。在关闭文件读取器之前,我们也会尝试关闭BufferedReader和FileReader,并处理可能出现的IO异常。同时,我们还处理了FileNotFoundException异常,这是当文件不存在时会抛出的异常。 5. 在设计和编程时,应尽可能减少异常的发生。通过良好的错误处理和输入验证,可以减少程序的异常。同时,对于已知的错误情况,可以考虑提供默认处理或者容错处理。 6. 当出现异常时,应该尽可能提供详细的错误信息。这可以帮助开发人员更好地理解问题并进行调试。在Java中,可以通过打印异常堆栈信息来实现这一点。 Snipaste_2023-09-18_22-22-52.png 7. 对于检查型异常,应该在最内层try-catch块中处理它们,以避免不必要的异常处理代码。这样可以避免代码混乱并提高可读性。 8. 对于非检查型异常,应该尽可能避免在catch块中使用空的异常处理程序。可以使用finally块来执行一些清理工作,以确保程序在异常情况下也能正确释放资源。

下面是一个示例程序,演示了如何使用finally块来关闭一个文件读取器:

import java.io.*;

public class Example {
    public static void main(String[] args) {
        try {
            File file = new File("input.txt");
            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在本文中,我们介绍了Java中的异常以及如何处理它们。我们首先介绍了Java中的两类主要异常:检查型异常和非检查型异常。接着,我们讨论了在Java中自定义异常的最佳实践,包括在异常处理时应避免的一些常见错误。最后,我们介绍了异常处理的常见策略以及如何在Java中关闭文件读取器。

Snipaste_2023-09-18_22-23-03.png 总之,异常处理是Java编程中非常重要的一个方面。正确的异常处理可以提高程序的可读性、可维护性和健壮性。在处理异常时,应该遵循一些最佳实践,并注意避免常见的错误。通过使用适当的异常处理策略,可以更好地管理错误和异常情况,并使程序更加稳定可靠。

标签:Java,处理,代码,常见,try,catch,new,异常
From: https://blog.51cto.com/itchenhan/7516955

相关文章

  • 巧用枚举解决业务场景的 Switch 语句—Java 实践
    巧用枚举解决业务场景的Switch语句——Java实践Switch语句是一种常见的流程控制语句,用于根据不同的条件执行不同的代码块。然而,当业务场景变得复杂时,使用大量的Switch语句可能导致代码冗长、难以维护和扩展。本文将介绍如何巧妙地使用枚举类型来优化和简化Switch语句的使......
  • Python中捕获异常的方法及异常处理try-except-else-finally的区别
    在Python中,try、except、else和finally是我们常用的异常处理方式,有一个清晰的执行顺序很重要。在这篇攻略中,我们将详细探讨这些关键字的执行顺序,以便更有效地处理异常。先回顾一下这些关键字的含义和用途:try:执行可能会抛出异常的代码块;except:当try代码块中出现了异常,执行此代......
  • 自定义异常类处理
    在编程过程中,异常是不避免的,为了是我们的代码更加可靠,我们需要学会如何处理异常。一下是自定义异常以及异常处理的一个小案例:#一.自定义异常类MyException类,测试当用户输入的数字大于90,raise主动抛出并处理该异常classMyException(Exception):def__init__(self,msg):......
  • JAVA高级架构师
    JAVA高级架构师技术包含:SpringBoot3.0,SpringCloudAlibaba,JDK11~19,Spring6,IOC,AOP,JavaWeb,SpringMVC,Mybatis,Docker,k8s,Devops,Vue3.0,Nginx,Redis7,MongoDB,JDBC,ShardingJDBC,Zookeeper,Dubbo,Activiti7,ES8,RabbitMQ,Redisson,Shiro,Paas,Neo4j,Kafka,Mycat,Tcp,ELK,SpringDa......
  • 9.18日课堂上java练习
    1importjava.util.ArrayList;2importjava.util.Random;3importjava.util.Scanner;4importjava.util.ArrayList;5importjava.util.Random;6importjava.util.Scanner;78publicclassCountdownThreadextendsThread{9privatest......
  • [JavaScript] JavaScript的时间与时区
    0序言第1章节,原创,主要关注:JS的时间、时区国际化问题第2章节,主要来自于第1篇参考文献(系对第1章节的基础知识的夯实)1JavaScript时间、时区的国际化(案例)本案例等同于问题:JavaScript从浏览器根据不同时区获取时间的问题假定现在有两台Windows笔记本电脑。Step1设置......
  • JavaWeb基础
    JavaWeb基础概念:JavaWeb,是用Java技术来解决相关web互联网领域的技术栈。web分为静态web和动态web,静态web包括css和html这种,设定后就不会变了,动态简单理解就是数据会随时改变,比如淘宝,每个人在不同时间不同地点看到的信息是不一向的,对于java来讲,动态web资源开发技术就统称为javaw......
  • 使用JavaScript或PHP限制垃圾邮件信息
    要限制垃圾邮件信息,可以使用JavaScript和PHP来执行以下方法:使用JavaScript限制垃圾邮件信息:表单验证:通过在表单提交之前使用JavaScript对输入的数据进行验证。可以检查电子邮件地址的格式、必填字段的输入以及其他特定规则。验证码:在表单中添加验证码字段,要求用户输入生成的验证码......
  • 无涯教程-JavaScript - PRODUCT函数
    描述PRODUCT函数将所有作为参数给出的数字相乘并返回乘积。如,如果单元格A1和A2包含数字,要将这两个数字相乘,可以使用以下公式=产品(A1,A2)这与与(*)数学运算符相乘相同。即=A1*A2当您需要将多个单元格相乘时,PRODUCT功能非常有用。Example=产品(A1:A3,C1:C3)这和=......
  • spring boot 在Linux下服务启动报错Unable to find Java
    前言:最近在开发项目的过程中遇到了一些坑(也可能不是坑,是自己没弄过导致折腾了很久),我们项目中遇到有用到一些第三方的库,有些第三方库可能不支持openjdk,只支出jdk,所以就要更换一下jdk,然后服务器又是之前的前同事配置的,这时候我把服务器的jdk版本从原来的openjdk1.7换成了官方的......