首页 > 编程语言 > 在Java中什么是异常

在Java中什么是异常

时间:2025-01-20 17:57:53浏览次数:3  
标签:Java FileReader 什么 System try catch 异常 public

目录

         一、定义:

二、异常的类型

1、检查型异常(Check Exceptions)

2、运行时异常(Runtime Exceptions)

3、错误(Errors)

三、异常处理机制

1、try-catch块

2、finally块

3、throws关键字

四、自定义异常

1、定义:

2、示例:


一、定义:

异常(Exception)是在程序执行过程中出现的意外或错误情况。


二、异常的类型

1、检查型异常(Check Exceptions)

        定义:这些异常是编译器要求必须处理的异常,(有时候也叫编译器异常或者编译器异常)。它们通常是在程序运行时由于外部因素(如文件不存在、网络连接失败等)导致的可预测的问题。

示例:java.io.FileNotFoundException。当你试图打开一个不存在的文件时,就会抛出这个异常。例如:

import java.io.File;
import java.io.FileReader;
public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            File file = new File("nonexistent.txt");
            FileReader reader = new FileReader(file);
        } catch (java.io.FileNotFoundException e) {
            System.out.println("文件不存在:" + e.getMessage());
        }
    }
}

        在这个例子中,FileReader构造函数会检查文件是否存在,如果不存在就会抛出FileNotFoundException异常因为这是一个检查型异常,所以必须使用try - catch块来处理它,或者在方法签名中声明该异常(使用throws关键字)。→这个很关键,是针对所有的检查型异常。

2、运行时异常(Runtime Exceptions)

        定义:这些异常是在程序运行时可能发生的逻辑错误。它们通常是由于程序员的错误导致的,例如数组越界、空指针引用等。编译器不会强制要求处理这些异常。

NullPointerException(空指针异常)为例:

public class RuntimeExceptionExample {
    public static void main(String[] args) {
        String str = null;
        // 以下代码会抛出NullPointerException
        System.out.println(str.length());
    }
}

        这里试图调用null对象的length方法,就会抛出NullPointerException。因为这是一个运行时异常,即使没有使用try - catch块处理,代码也能编译通过,但在运行时会出现错误。

3、错误(Errors)

        定义:这些是严重的问题,通常是由 Java 虚拟机(JVM)内部的错误或者资源耗尽等情况导致的。程序通常无法从这些错误中恢复,例如 OutOfMemoryError(内存溢出错误)、StackOverflowError(虚拟机栈溢出错误)


三、异常处理机制

1、try-catch块

        作用:用于捕获和处理异常。try块中包含可能会抛出异常的代码,catch块用于捕获特定类型的异常并进行相应的处理。

语法:

try {
    // 可能抛出异常的代码
} catch (ExceptionType1 e1) {
    // 处理ExceptionType1类型异常的代码
} catch (ExceptionType2 e2) {
    // 处理ExceptionType2类型异常的代码
}

例如,处理多种类型的异常:

try {
    int[] arr = new int[5];
    System.out.println(arr[10]);
    File file = new File("nonexistent.txt");
    FileReader reader = new FileReader(file);
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("数组越界:" + e.getMessage());
} catch (FileNotFoundException e) {
    System.out.println("文件不存在:" + e.getMessage());
}

        在这个例子中,try块中有两个可能抛出异常的操作。如果发生数组越界异常,会被第一个catch块捕获并处理;如果发生文件不存在异常,会被第二个catch块捕获并处理。

(对于单独的try{……},这里解释一下会自动关闭try块中定义的“资源对象”

例如:

 public static void main(String[] args) {
        // try 代码块:
        // 作用1:自动关闭Scanner对象
       
        try (Scanner input = new Scanner(System.in)) {
            int n1 = input.nextInt(); 
            int n2 = input.nextInt();

            int result = n1 /n2; 
            System.out.printf("%d ÷ %d = %d",n1,n2,result);
        }
    }

        当使用 try (Scanner input = new Scanner(System.in)) 这种 try-with-resources 语句时,可以自动关闭 Scanner 对象。当 try 代码块执行结束时,无论是否发生异常,Scanner 对象的 close() 方法都会被自动调用,从而释放资源,防止资源泄漏。这样可以让代码更加简洁和安全,避免忘记调用 close() 方法导致的资源管理问题。

2、finally块

        作用:无论try块中是否抛出异常,finally块中的代码都会被执行。它通常用于释放资源,如关闭文件、数据库连接等。

语法:

try {
    // 可能抛出异常的代码
} catch (Exception e) {
    // 处理异常的代码
} finally {
    // 总是执行的代码
}

例如:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class FinallyExample {
    public static void main(String[] args) {
        FileReader reader = null;
        try {
            File file = new File("test.txt");
            reader = new FileReader(file);
            // 读取文件内容等操作
        } catch (IOException e) {
            System.out.println("读取文件出错:" + e.getMessage());
        } finally {
            if (reader!= null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    System.out.println("关闭文件出错:" + e.getMessage());
                }
            }
        }
    }
}

        在这个例子中,不管try块中读取文件是否成功(是否抛出IOException),finally块都会尝试关闭FileReader对象,以释放资源。

3、throws关键字

        作用:用于在方法签名中声明该方法可能抛出的异常。这样,调用这个方法的代码就可以选择处理这些异常或者继续向上层抛出。

语法:

public void methodName() throws ExceptionType1, ExceptionType2 {
    // 方法体可能抛出ExceptionType1和ExceptionType2类型的异常
}

例如:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class ThrowsExample {
    public static void readFile() throws FileNotFoundException {
        File file = new File("test.txt");
        FileReader reader = new FileReader(file);
    }
    public static void main(String[] args) {
        try {
            readFile();
        } catch (FileNotFoundException e) {
            System.out.println("文件不存在:" + e.getMessage());
        }
    }
}

        在这个例子中,readFile方法使用throws关键字声明了可能抛出FileNotFoundException(检查型异常)。在main方法中调用readFile方法时,使用try - catch块来处理这个可能抛出的异常或者在方法签名中声明该异常(使用throws关键字)。


四、自定义异常

1、定义:

        可以通过继承Exception(用于检查型异常)或RuntimeException(用于运行时异常)类来创建自己的异常类。这在需要根据特定的业务逻辑定义异常情况时非常有用。

2、示例:

假设我们要创建一个表示年龄不合法的异常。首先创建一个自定义异常类:

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

然后在一个方法中使用这个自定义异常:

public class CustomExceptionExample {
    public static void checkAge(int age) throws InvalidAgeException {
        if (age < 0 || age > 150) {
            throw new InvalidAgeException("年龄必须在0到150之间");
        } else {
            System.out.println("年龄合法");
        }
    }
    public static void main(String[] args) {
        try {
            checkAge(-5);
        } catch (InvalidAgeException e) {
            System.out.println("年龄不合法:" + e.getMessage());
        }
    }
}

        在这个例子中,checkAge方法会检查传入的年龄是否合法。如果不合法,就会抛出InvalidAgeException。因为InvalidAgeException异常是继承Exception(检查型异常)所以在main方法中,使用try - catch块来处理这个自定义异常。

标签:Java,FileReader,什么,System,try,catch,异常,public
From: https://blog.csdn.net/CSDN_xysf/article/details/145266617

相关文章

  • 为什么程序员和老板不能直接沟通?
    文章目录摘要为什么很多人从程序员到管理者,反而感到特别难?程序员想要和老板沟通需要克服什么小结摘要程序员掌握的都是面向程序的专业知识术语,对很多业务型,销售型的老板来说,他们根本不懂,所以沟通难度就很大。项目经理和产品经理基于原型图和设计图反而更好的老板沟......
  • 【K8S系列】K8s 领域深度剖析:年度技术、工具与实战总结 (思维导图-java架构)
    创建一个关于Kubernetes(简称K8s)领域的深度剖析年度总结的思维导图,特别是针对Java架构师的需求,可以帮助梳理和理解过去一年中重要的技术进展、工具以及实战经验。下面是一个基于文本的思维导图结构建议,你可以根据这个结构使用任何思维导图软件来创建你的图形化版本。Kuberne......
  • AI编程工具使用技巧——Cursor (思维导图-java架构)
    Cursor是一个AI辅助编程工具,它能够帮助开发者更快地编写代码、理解现有代码库以及解决编程中遇到的问题。当涉及到Java架构时,利用Cursor可以极大地提高开发效率和代码质量。以下是围绕着如何使用Cursor进行Java项目开发的思维导图建议框架:AI编程工具使用技巧-Cursor(Java......
  • 人脸识别【java-基于OpenCV】思维导图-java架构
    为了创建一个关于基于OpenCV的Java人脸识别项目的思维导图,可以围绕项目的主要组成部分进行组织:环境搭建、数据准备、人脸检测、特征提取、模型训练、识别与验证、以及优化和部署。以下是一个结构化的建议框架,你可以根据这个框架使用任何思维导图软件来创建具体的图形化版本......
  • JAVA开源毕业设计 在线课程管理系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T137,文末自助获取源码\color{red}{T137,文末自助获取源码}......
  • Java初学者笔记-08、IO流
    I:负责把磁盘和网络中的数据读到程序内存中去。O:负责把程序内存中的数据写到网络或者磁盘中。按照流的内容,IO流分为字节流和字符流。字节流:最小单位是字节。适合操作所有类型的文件。比如音频、视频、图片文本等的复制,转移。字符流:只适合操作纯文本文件。比如读写txt,java文件......
  • RabbitMQ 及 java 使用
    目录1.消息中间件概述1.1.什么是消息中间件1.2.AMQP和JMS1.2.1.AMQP1.2.2.JMS1.2.3.AMQP与JMS区别1.3.消息队列产品1.4.RabbitMQ2.RabbitMQ入门2.1.搭建示例工程2.1.1.创建工程2.1.2.添加依赖2.2.编写生产者2.3.编写消费者2.4.小结3.AMQP3.1.相关概念介绍3.......
  • 使用 Java 获取淘宝推荐商品列表 API 接口的示例代码解析
    在电商领域,推荐系统是提升用户体验和促进销售的重要工具。淘宝开放平台提供了taobao.item.recommend接口,允许开发者根据用户行为、搜索关键词或分类ID获取推荐商品列表。本文将详细介绍如何使用Java调用该接口,并解析返回的数据。一、淘宝推荐商品接口简介taobao.item.reco......
  • (2024最新毕设合集)基于SpringBoot的游乐园管理系统-69394|可做计算机毕业设计JAVA、PHP
    目录1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2系统分析2.1可行性分析2.1.1经济可行性2.1.2技术可行性2.1.3操作可行性2.2系统流程分析2.2.1系统开发流程2.2.2用户登录流程2.2.3系统操作流程2.2.4添加信息流程2.2.5......
  • 使用Java爬虫获取微店商品详情实践指南
    在电商领域,获取商品详情数据对于商家和开发者来说至关重要。微店作为国内知名的电商平台,提供了丰富的商品数据接口,方便开发者通过API调用获取商品详情。以下将详细介绍如何使用Java爬虫获取微店商品详情,并提供具体的代码示例。一、微店商品详情API接口简介微店提供了商品详情......