Day37--error和exception

news/2025/2/25 10:46:21/文章来源:https://www.cnblogs.com/xiaokunzhong/p/18565535

Day37--error和exception

Exception 异常

Error 错误

目录:

1、什么是异常
2、异常体系结构
3、Java异常处理机制
4、处理异常
5、自定义异常
6、总结

什么是异常

实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求,你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了。等等。

软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文是:Exception,意思是例外。这些,例外情况,或者叫异常,怎么让我们写的程序做出合理的处理。而不至于程序崩溃。

异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。

异常发生在程序运行期间,它影响了正常的程序执行流程。

有的异常,在IDEA未运行的时候,就提示出来了,及时改正就可以了。但是,有的错,只有当代码运行起来,才能知道

示例1:

在Demo01里面,创建main方法,再创建main方法之外的a、b方法。a方法的内容是调用b方法;b方法的内容是调用a方法。然后在main方法里面实例化Demo01,调用a方法,然后执行

package com.liu.exception;public class Demo01 {public static void main(String[] args) {new Demo01().a();}public void a() {b();}public void b() {a();}
}
/*
Exception in thread "main" java.lang.StackOverflowError  程序因为栈溢出而异常终止。at com.liu.exception.Demo01.b(Demo01.java:13)at com.liu.exception.Demo01.a(Demo01.java:9)at com.liu.exception.Demo01.b(Demo01.java:13)at com.liu.exception.Demo01.a(Demo01.java:9)at com.liu.exception.Demo01.b(Demo01.java:13)at com.liu.exception.Demo01.a(Demo01.java:9)at com.liu.exception.Demo01.b(Demo01.java:13)*/

异常形式 java.lang.StackOverflowError 程序因为栈溢出而异常终止。

代码易错:

package com.liu.exception;public class Demo01 {public static void main(String[] args) {a();  //出错}public void a() {b();}public void b() {a();}
}

详细解释:

  1. 问题分析

    • 在Java中,main方法是一个静态方法。静态方法属于类本身,而不是类的实例。它可以在没有创建类的对象的情况下被调用。
    • 然而,在这个Demo01类中,a方法是非静态的(没有static关键字修饰)。非静态方法属于类的实例,需要通过类的对象来调用。
    • 当在main方法(静态方法)中直接调用a方法(非静态方法)时,就会出现“无法从静态上下文中引用非静态方法”的错误。这是因为静态方法中没有隐含的this对象(this指向当前实例)来调用非静态方法。
  2. 解决方法

    • 有两种常见的解决方法:
      • 方法一:将a方法改为静态方法
        • 如果a方法不需要访问类的实例变量,可以将a方法改为静态方法。修改后的代码如下:
package com.liu.exception;public class Demo01 {public static void main(String[] args) {a();}public static void a() {b();}public static void b() {a();}
}
   - 这样,因为`a`方法变成了静态方法,就可以在`main`方法中直接调用了。- **方法二:通过类的实例来调用`a`方法**- 创建`Demo01`类的一个实例,然后通过这个实例来调用`a`方法。修改后的代码如下:
package com.liu.exception;public class Demo01 {public static void main(String[] args) {new Demo01().a();}public void a() {b();}public void b() {a();}
}
   - 这里通过`new Demo01()`创建了`Demo01`类的一个对象,然后使用这个对象来调用`a`方法,这样就符合了非静态方法需要通过实例来调用的规则。

再例如:

​ 整数相除;除数是0

package com.liu.exception;public class Demo01 {public static void main(String[] args) {System.out.println(11/0);//ArithmeticException}}

ArithmeticException:计算异常 (Arithmetic:计算)

这种异常通常会在以下情况下被抛出:

  1. 整数除零:当尝试用0作为除数进行整数除法操作时(例如,int result = 10 / 0;),会抛出 ArithmeticException

  2. 取余运算中的零除数:与整数除零类似,当在取余运算(模运算)中使用0作为除数时(例如,int remainder = 10 % 0;),也会抛出此异常。

    需要注意的是,浮点除法(例如,double result = 10.0 / 0.0;)不会产生 ArithmeticException,而是会得到 InfinityNaN(非数字)作为结果,这是因为在Java中,浮点数的除零操作有明确的数学定义。

要理解Java异常处理机制,你需要掌握以下三种类型的异常和错误:

检查性异常(Checked Exception):
检查性异常是在编译时被检查并要求处理的异常。这些异常通常是由用户错误或外部问题引起的,程序员在编写代码时需要预见并处理这些异常。例如,当尝试打开一个不存在的文件时,会抛出一个FileNotFoundException,这是一个检查性异常。编译器会强制程序员在代码中处理这些异常,要么通过捕获异常(使用try-catch语句),要么通过声明异常(在方法签名中使用throws关键字)。

运行时异常(Unchecked Exception):
运行时异常是在运行时发生的异常,这些异常通常是编程错误或不可预见的问题引起的。与检查性异常不同,运行时异常在编译时不会被检查,因此程序员可以选择是否处理这些异常。常见的运行时异常包括NullPointerException(空指针异常)、ArithmeticException(算术异常)等。虽然编译器不会强制处理这些异常,但良好的编程实践是尽可能捕获和处理这些潜在的异常,以提高程序的健壮性和稳定性。
错误(Error):
错误是Java中比异常更严重的问题,它们通常表示JVM(Java虚拟机)层面的严重问题,如内存不足、栈溢出等。错误在代码中通常无法被捕获或处理,因为它们是系统级的错误,超出了程序员的控制范围。当发生错误时,JVM通常会选择终止线程或进程。虽然程序员无法直接处理错误,但了解错误的类型和原因有助于编写更健壮的代码,并减少错误发生的可能性。

异常体系结构

Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。

在JavaAPl中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。

JavaSE从基础到入门:异常的学习_javase学习异常-CSDN博客

Error

  • Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
  • Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止;
  • 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。

Exception

  • 在Exception分支中有一个重要的子类RuntimeException(运行时异常)
    • ArrayIndexOutOfBoundsException(数组下标越界)
    • NullPointerException(空指针异常)
    • ArithmeticException(算术异常)
    • MissingResourceException(丢失资源)
    • ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
  • 这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;
  • Error和Exception的区别:Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。

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

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

相关文章

从零开始:NetBox 4.1 Docker 部署和升级

前言 由于Netbox 官方的中文语言日渐完善,所以新出一个使用官方Docker源部署和升级的教程。 Netbox 系列文章:https://songxwn.com/categories/NetBox/环境介绍 Rocky Linux 9.5 (理论上也适用于RHEL系列的7-9版本) 南京大学镜像源ISO镜像下载:https://mirror.nju.edu.cn/…

如何只因算看到篮板需要的视场角

要脸别看这是一篇只因🐭文档,没有任何意义,不要看,但是邹老板让我写我就写了。 视场角是什么 视场角是在光学仪器中,以光学仪器的镜头为顶点,以被测目标的物象可通过镜头的最大范围的两条边缘构成的夹角。视场角的大小决定了光学仪器的视野范围,视场角越大,视野就越大…

编辑器快速打印html模板结构

一般编辑器,新建html文件时,会自带模板结构

dedeCMS 后台账号或密码忘记了怎么办

问题:后台管理员账号或密码忘记。 解决办法:数据库修改:打开数据库中的 dede_admin 表,找到管理员记录,将 pwd 字段的值改成 f297a57a5a743894a0e4,密码将被重置为 admin。重置工具:下载织梦后台管理员密码重置工具,将 resetpwd.php 放在网站根目录。 在浏览器上打开 h…

帝国CMS封面页调用指定栏目缩略图代码

调用栏目ID为2的栏目缩略图:[e:loop={"select classid,classname,classimg,intro from phome_enewsclass where classid=2",1,24,0}] <img src="<?=$bqr[classimg]?>" border="0" width="140" height="140" alt…

[Linux]exec系列函数

exec系列函数exec系列函数是用来进行程序的替换的。替换原理 当使用fork函数创建子进程后,子进程会执行与父进程相同的代码(但也有可能执行不同的代码分支),子进程会通过调用exec函数来执行另一个程序。当调用exec函数时,会用新程序的代码和数据来覆盖当前进程的代码和数据…

使用 JavaScript 的 XMLHttpRequest 或 Fetch API 发送 HTTP 请求时,GET 请求和 POST 请求处理参数的方式不同,这与 HTTP 协议的设计有关

使用 JavaScript 的 XMLHttpRequest 或 Fetch API 发送 HTTP 请求时,GET 请求和 POST 请求处理参数的方式不同,这与 HTTP 协议的设计有关 GET 请求的参数特点:GET 请求的参数通过 URL 传递。 原因: URL 表现方式:GET 请求的主要目的是从服务器获取资源。URL 是资源的唯一标…

IoU已经out了,试试这几个变体:GIoU、DIoU和CIoU介绍与对比分析

这是目标检测领域的首选评估指标。计算两个边界框的IoU时,如果它们有重叠区域,就测量重叠面积,然后除以两个框所覆盖的总面积。你是否曾经训练过一个模型,在评估指标上表现出色,但在实际可视化边界框时,却发现它在许多情况下都失败了?这可能是因为像简单交并比(IoU)这样的标准…

计算机是怎样跑起来的

总结自书籍:https://weread.qq.com/web/reader/b9b324005dd9f0b9b9e6f17k0e6320502c60e65972dc52f#outline?noScroll=10 前提 计算机的三个根本性基础计算机是执行输入、运算、输出的机器计算机的硬件由大量集成电路(IC)组成,每块IC都有许多引脚,用于输入/输出,IC在其内部…

2024-2025-1 20241428张雄一《计算机基础与程序设计》第九周学习总结

学期(如2024-2025-1) 学号20241428 《计算机基础与程序设计》第9周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业的目标 操作系统责任、内存与进程管理、分时系统、CPU调度、文件、文件系统、文件保护、磁盘调度…

【CodeForces训练记录】CodeTON Round 9 (Div. 1 + Div. 2, Rated, Prizes!)

训练情况赛后反思 发现自己越来越能猜结论了,连续两题结论猜对了,一把rating上青了。 A题 构造一个数组使得模数互不相同,考虑构造一个模数为 \([0,1,2,3,4,5]\) 的数列,所以一个全是奇数的数列 \([1,3,5,7,9]\) 符合条件,直接输出 \(1 \sim n\) 的奇数即可。 #include &l…

Cellebrite UFED 4PC 7.71 发布下载 - Android 和 iOS 移动设备取证软件

Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件 The Industry Standard for Lawfully Accessing and Collecting Digital Data 请访问原文链接:https://sysin.org/blog/cellebr…