Java学习教程,从入门到精通,Java异常(Exceptions)语法知识点及案例代码(45)

1、Java异常(Exceptions)语法知识点及案例代码

在Java编程中,异常处理是一项重要的技能。异常是指在程序运行时发生的错误情况,这些错误情况会中断程序的正常执行。Java通过异常处理机制,允许开发者捕获和处理这些异常,使程序更加健壮和可靠。

2、异常处理基础
  1. 异常的概念

    • 异常(Exception)指的是程序在执行过程中,出现的非正常情况,最终导致JVM的非正常停止。
    • 异常本身是一个类,产生异常就是创建异常对象并抛出一个异常对象。
  2. 异常体系

    • Java的异常体系基于java.lang.Throwable类,它有两个子类:java.lang.Errorjava.lang.Exception
    • Error表示严重错误,是系统级别的错误,通常无法恢复。
    • Exception表示异常,是程序可以处理的错误,可以通过捕获异常来恢复程序的执行。
  3. 异常分类

    • 编译时异常(Checked Exception):在编译时期检查,如果没有处理异常,则编译失败。
    • 运行时异常(Runtime Exception):在运行时检查,编译时期不会检测。
  4. 异常处理的关键字

    • try:包含要监视的程序语句,如果发生异常,则抛出异常。
    • catch:捕获异常并以合理的方式处理。
    • throw:手动抛出一个异常对象。
    • throws:声明一个方法可能会抛出的异常,让调用者处理。
    • finally:无论是否发生异常,finally块中的代码都会执行,用于清理资源。
示例代码
  1. 捕获和处理异常
public class Main {public static void main(String[] args) {try {int[] arr = new int[5];System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组越界异常:" + e.getMessage());}try {String str = null;System.out.println(str.length()); // 抛出NullPointerException} catch (NullPointerException e) {System.out.println("空指针异常:" + e.getMessage());}try {int d = 0;int a = 42 / d; // 抛出ArithmeticException} catch (ArithmeticException e) {System.out.println("除零异常:" + e.getMessage());}}
}
  1. 使用finally块
public class Main {public static void main(String[] args) {try {int[] arr = new int[5];System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组越界异常:" + e.getMessage());} finally {System.out.println("finally块中的代码,无论是否发生异常都会执行。");}}
}
  1. 抛出异常
public class Main {public static void main(String[] args) {try {testMethod(0);} catch (IllegalArgumentException e) {System.out.println("捕获到异常:" + e.getMessage());}}public static void testMethod(int age) throws IllegalArgumentException {if (age < 0) {throw new IllegalArgumentException("年龄不能为负数");}System.out.println("年龄是:" + age);}
}
  1. 声明异常
import java.io.FileNotFoundException;public class Main {public static void main(String[] args) throws FileNotFoundException {readFile("nonexistent.txt");}public static void readFile(String filePath) throws FileNotFoundException {if (!filePath.equals("existent.txt")) {throw new FileNotFoundException("文件不存在");}System.out.println("文件读取成功");}
}
  1. 多个catch块
public class Main {public static void main(String[] args) {try {int a = Integer.parseInt(args[0]);int b = 42 / a;int[] c = {1};c[42] = 99;} catch (ArithmeticException e) {System.out.println("除零异常:" + e.getMessage());} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组越界异常:" + e.getMessage());} catch (NumberFormatException e) {System.out.println("数字格式异常:" + e.getMessage());}System.out.println("异常处理完毕");}
}
  1. 嵌套try-catch块
public class Main {public static void main(String[] args) {try {int a = Integer.parseInt(args[0]);int b = 42 / a;try {if (a == 1) {a = a / (a - a); // 除零异常} else if (a == 2) {int[] c = {1};c[4] = 99; // 数组越界异常}} catch (ArithmeticException e) {System.out.println("内层除零异常:" + e.getMessage());} catch (ArrayIndexOutOfBoundsException e) {System.out.println("内层数组越界异常:" + e.getMessage());}} catch (NumberFormatException e) {System.out.println("数字格式异常:" + e.getMessage());} catch (ArrayIndexOutOfBoundsException | NullPointerException e) {System.out.println("数组越界或空指针异常:" + e.getMessage());}System.out.println("异常处理完毕");}
}
总结

通过掌握Java异常处理的基础知识,包括异常的概念、异常体系、异常分类以及异常处理的关键字,你可以编写更加健壮和可靠的Java程序。通过示例代码,你可以看到如何捕获和处理异常、使用finally块进行资源清理、抛出和声明异常,以及如何处理多个不同类型的异常。

以下是一些具体的Java异常处理案例,涵盖了编译时异常、运行时异常以及自定义异常等方面:

编译时异常处理案例

  1. 文件未找到异常(FileNotFoundException)

    • 场景:在尝试打开一个不存在的文件时,会抛出此异常。
    • 示例代码
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;public class FileNotFoundExceptionExample {public static void main(String[] args) {File file = new File("./nonexistentfile.txt");try (FileInputStream inputStream = new FileInputStream(file)) {// 尝试读取文件内容} catch (FileNotFoundException e) {System.err.println("文件未找到: " + e.getMessage());} catch (IOException e) {// 处理其他IO异常e.printStackTrace();}}
    }
    
  2. 类型转换异常(ClassCastException)

    • 场景:在将对象强制转换为不兼容类型时,会抛出此异常。
    • 示例代码
    public class ClassCastExceptionExample {public static void main(String[] args) {Object obj = "Hello";try {String str = (String) obj; // 实际上obj是String类型,这里不会抛出异常// 但如果obj是其他类型,比如Integer,就会抛出ClassCastException} catch (ClassCastException e) {System.err.println("类型转换异常: " + e.getMessage());}}
    }
    
    • 注意:在实际代码中,应避免将obj声明为其他类型来触发异常,此示例仅用于说明异常类型。

运行时异常处理案例

  1. 数组越界异常(ArrayIndexOutOfBoundsException)

    • 场景:在访问数组时,如果索引超出数组的有效范围,就会抛出此异常。
    • 示例代码
    public class ArrayIndexOutOfBoundsExceptionExample {public static void main(String[] args) {int[] arr = new int[5];try {System.out.println(arr[5]); // 索引5超出数组范围,抛出异常} catch (ArrayIndexOutOfBoundsException e) {System.err.println("数组越界异常: " + e.getMessage());}}
    }
    
  2. 空指针异常(NullPointerException)

    • 场景:在尝试使用未初始化(或已初始化为null)的对象时,会抛出此异常。
    • 示例代码
    public class NullPointerExceptionExample {public static void main(String[] args) {String str = null;try {System.out.println(str.length()); // str为null,调用length()方法时抛出异常} catch (NullPointerException e) {System.err.println("空指针异常: " + e.getMessage());}}
    }
    
  3. 算术异常(ArithmeticException)

    • 场景:在发生数学错误时(如除以零),会抛出此异常。
    • 示例代码
    public class ArithmeticExceptionExample {public static void main(String[] args) {try {int result = 10 / 0; // 除以零,抛出异常System.out.println(result);} catch (ArithmeticException e) {System.err.println("算术异常: " + e.getMessage());}}
    }
    

自定义异常处理案例

  1. 自定义异常类

    • 场景:当需要定义特定于应用程序的异常时,可以创建自定义异常类。
    • 示例代码
    public class CustomException extends Exception {private String errorMessage;public CustomException(String errorMessage) {this.errorMessage = errorMessage;}public String getErrorMessage() {return errorMessage;}
    }
    
  2. 使用自定义异常

    • 场景:在应用程序中抛出并捕获自定义异常。
    • 示例代码
    public class CustomExceptionExample {public static void main(String[] args) {try {throw new CustomException("自定义异常信息");} catch (CustomException e) {System.err.println("捕获到自定义异常: " + e.getErrorMessage());}}
    }
    

这些案例涵盖了Java异常处理的不同方面,包括编译时异常、运行时异常以及自定义异常的处理。通过这些案例,可以更好地理解Java异常处理机制,并在实际编程中灵活运用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/481446.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能-科普】深度森林:传统机器学习与深度学习的创新结合

文章目录 深度森林:传统机器学习与深度学习的创新结合一、什么是深度森林?二、深度森林的工作原理1. **特征提取和转换**2. **多层级训练**3. **最终分类**三、深度森林的关键组成部分1. **森林层(Forest Layer)**2. **级联结构(Cascade Structure)**3. **特征增强(Feat…

Netty的内存池机制怎样设计的?

大家好&#xff0c;我是锋哥。今天分享关于【Netty的内存池机制怎样设计的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Netty的内存池机制怎样设计的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty 的内存池机制设计是为了提高性能&…

Postman设置接口关联,实现参数化

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这…

七牛云成功保存但无法显示和访问{“error“:“download token not specified“}

在使用七牛云存储图片时&#xff0c;前端通过链接访问图片时遇到错误&#xff1a; {"error":"download token not specified"} 具体表现为&#xff1a; 后端通过 access_key 和 secret_key 生成了上传和下载的 Token。前端将域名与 res.key 拼接后生成图…

《实战OpenCV系列》专栏介绍

简介 本专栏由浅入深&#xff0c;详细介绍了使用OpenCV进行图像/视频处理的各方面知识&#xff0c;包括&#xff1a;图像显示、图像的数学运算、图像的裁剪与拼接、图像的像素操作、几何变换、直方图、图像滤波、色彩空间转换、边缘检测、形态学操作、模板匹配、视频处理、图像…

常用函数的使用错题汇总

#include <iostream> #include <fstream> #include <string>int main() {std::ifstream fin("example.txt"); // 创建 ifstream 对象并打开文件// 检查文件是否成功打开if (!fin) {std::cerr << "Error opening file!" << s…

曲面单值化定理

曲面单值化定理&#xff08;Uniformization Theorem&#xff09;是复分析、几何和拓扑学中的一个重要结果。它为紧致黎曼曲面提供了标准化的几何结构&#xff0c;是研究复几何和代数几何的基础。以下是对曲面单值化定理的详细介绍以及其应用场景。 曲面单值化定理的陈述 基本版…

【初阶数据结构和算法】二叉树顺序结构---堆的定义与实现(附源码)

文章目录 一、堆的定义与结构二、堆的实现1.堆的初始化和销毁堆的初始化堆的销毁 2.向上调整算法和入堆向上调整算法入堆 3.向下调整算法和出堆顶数据向下调整算法出堆 4.堆的有效数据个数和判空堆的有效数据个数堆的判空 5.取堆顶数据 三、堆的源码 一、堆的定义与结构 本篇内…

进程的知识

1. 冯诺依曼体系结构 输入设备&#xff1a;键盘&#xff0c;话筒&#xff0c;网卡&#xff0c;磁盘&#xff08;外存&#xff09; 外设&#xff1a; 输出设备&#xff1a;显示器&#xff0c;磁盘&#xff0c;网卡&#xff0c;打印机 CPU运算器控制器 存储器&#xff1a…

创建HTTPS网站

每天&#xff0c;我们都会听到网络上发生身份盗窃和数据侵权的案例&#xff0c;这导致用户对自己访问的网站更加怀疑。他们开始更加了解自己将个人信息放在哪里以及信任哪些类型的网站。了解如何使网站使用HTTPS变得比以往任何时候都更加重要。 解读缩略词&#xff1a;HTTP与HT…

pytest+allure生成报告显示loading和404

pytestallure执行测试脚本后&#xff0c;通常会在电脑的磁盘上建立一个临时文件夹&#xff0c;里面存放allure测试报告&#xff0c;但是这个测试报告index.html文件单独去打开&#xff0c;却显示loading和404, 这个时候就要用一些办法来解决这个报告显示的问题了。 用命令产生…

如何使用ST7789展现图片?[ESP--4]

本节我们继续ESP和ST 7789的话题&#xff0c;这节课我们来学学如何展示图片,话不多说&#xff0c;先上效果 好&#xff0c;教程开始~前情提要&#xff0c;要看懂这篇&#xff0c;建议搭配楼主的前两期文章 使用ESP32驱动LCD-ST7789屏幕[ESP–2] 加速你的LCD-ST7789屏幕&#xf…

南京仁品耳鼻喉专科医院:12月启动公益义诊月

专业医疗资源送至“家门口”&#xff01;南京仁品耳鼻喉专科医院启动公益义诊月 随着2024年即将步入尾声&#xff0c;南京仁品耳鼻喉医院为回馈社会&#xff0c;提升公众健康福祉&#xff0c;将于12月隆重推出“三甲专家公益义诊月”活动。此次活动旨在通过汇聚众多耳鼻喉领域…

数据结构—排序算法(python实现)

数据结构 脑图排序算法1.冒泡排序1.1步骤1.2python代码实现冒泡&#xff1a;1.3分析冒泡 2.插入排序2.1步骤2.2python代码实现插入排序&#xff1a;2.3分析插入 3.选择排序3.1步骤3.2python代码实现&#xff1a;3.3分析选择 4.快速排序4.1步骤4.2python代码实现&#xff1a;4.3…

Pinia管理用户数据

Pinia 是 Vue3 的新一代状态管理库&#xff0c;提供了更简单的 API 和更好的 TypeScript 支持。它作为 Vuex 的替代方案&#xff0c;成为了管理 Vue 应用状态的首选。Pinia 是 Vue3 的新一代状态管理库。与 Vuex 相比&#xff0c;Pinia 提供了更简单的 API、更好的性能&#xf…

远程协助软件Todesk免费版有什么限制

大名鼎鼎的远程todesk也开始出限制了&#xff0c;国内远程协助一直是向日葵一家独大&#xff0c;todesk起来以后慢慢占领了部分市场&#xff0c;随用户越来越多&#xff0c;其服务器也开始不堪重负了&#xff0c;于2024年的6月发了公告&#xff0c;出告了限制发表的措施具体如下…

电路基础——相量法

相量法 为什么要使用相量表示&#xff1f; 电路方程是微分方程&#xff1a; 电路的运算&#xff08;如KCL、KVL方程运算&#xff09;会涉及到两个正弦量的相加&#xff1a; 如下图所示同频率的正弦量相加仍得到同频率的正弦量&#xff0c;因此只需确定初相位和有效值。 基于上…

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题 2024/11/29 21:11 缘起&#xff1a;中科创达的高通CM6125开发板的Android10的编译环境需要。 vendor/qcom/proprietary/commonsys/securemsm/seccamera/service/jni/jni_if.…

redis的应用----缓存

redis的应用----缓存 一、缓存的概念二、使用redis作为缓存2.1使用redis作为缓存的原因2.2缓存机制的访问步骤 三、缓存的更新策略3.1定期更新3.2实时更新3.3淘汰策略 四、缓存常见的问题4.1缓存预热(Cache preheating)4.2缓存穿透(Cache penetration)4.3缓存雪崩(Cache avalan…

【S500无人机】--地面端下载

之前国庆的时候导师批了无人机&#xff0c;我们几个也一起研究了几次&#xff0c;基本把无人机组装方面弄的差不多了&#xff0c;还差个相机搭载&#xff0c;今天我们讲无人机的调试 硬件配置如下 首先是地面端下载&#xff0c;大家可以选择下载&#xff1a; Mission Planne地…