首页 > 其他分享 >Day37--error和exception

Day37--error和exception

时间:2024-11-24 11:15:41浏览次数:6  
标签:exception -- Day37 void liu Demo01 异常 public

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通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。

标签:exception,--,Day37,void,liu,Demo01,异常,public
From: https://www.cnblogs.com/xiaokunzhong/p/18565535

相关文章

  • 从零开始:NetBox 4.1 Docker 部署和升级
    前言由于Netbox官方的中文语言日渐完善,所以新出一个使用官方Docker源部署和升级的教程。Netbox系列文章:https://songxwn.com/categories/NetBox/环境介绍RockyLinux9.5(理论上也适用于RHEL系列的7-9版本)南京大学镜像源ISO镜像下载:https://mirror.nju.edu.cn/rocky/9/isos......
  • C题目:有3个候选人,每个选民只能投票一个人,要求编一个统计选票的程序,先后输出候选人的名
    C题目:有3个候选人,每个选民只能投票一个人,要求编一个统计选票的程序,先输出候选人的名字,最后输出各个人所的票结果。代码:#include<stdio.h>#include<string.h>structPerson{charname[20];intcount;}leader[3]={{"li",0},{"zhang",0},{"sun",......
  • [BJDCTF2020]ZJCTF,不过如此 1
    [BJDCTF2020]ZJCTF,不过如此1打开实例发现代码审计需要GET传入text和file参数,然后执行文件包含text需要读取到Ihaveadream文本,这边采用data流进行绕过?text=data://,Ihaveadream&file=next.php成功绕过,接下来进行file文件包含这边提示读取next.php,访问后无有效数据......
  • ListDLLs 是一个工具程序,通常用于列出 Windows 操作系统中当前加载的动态链接库(DLL)。
    ListDLLs是一个工具程序,通常用于列出Windows操作系统中当前加载的动态链接库(DLL)。它能够显示系统中所有的DLL文件,以及这些文件在不同进程中的加载情况。这个工具对于开发者、系统管理员和安全分析人员来说,具有一定的实用价值,特别是在诊断软件问题、分析进程和检测恶意软件时......
  • 皇家在线客服编写系统时hj8828,vip需要注意以下关键要素CRM
    在编写在线客服系统时,【hj8828.vip】薇:【Lgj88288】需要注意以下关键要素,以确保系统的高效性、稳定性和用户体验:一、系统兼容性1.多渠道接入:确保在线客服系统能够兼容公司现有的所有业务交付和引流渠道,如微信、微博、小程序、商城、APP等热门平台。这有助于统一管理和分配不同渠......
  • [CodeForces] CF21 题解
    这次不放难度了。因为我懒A.JabberID【题目大意】一个地址由<username>@<hostname>[/resource]组成,其中[/resource]可以被省略。<username>字段允许大写、小写字母,数字、下划线,其长度应在\(1\)到\(16\)之间。<hostname>字段允许用.来分隔。每一段的要求同<u......
  • 【RAG 项目实战 05】重构:封装代码
    【RAG项目实战05】重构:封装代码NLPGithub项目:NLP项目实践:fasterai/nlp-project-practice介绍:该仓库围绕着NLP任务模型的设计、训练、优化、部署和应用,分享大模型算法工程师的日常工作和实战经验AI藏经阁:https://gitee.com/fasterai/ai-e-book介绍:该仓库主要分享......
  • 2024退市新规
    一、退市规则退市包括主动退市和强制退市两类。强制退市分为交易类强制退市、财务类强制退市、规范类强制退市和重大违法类强制退市等四类情形。 主动退市:1、上市公司向证券交易所主动提出申请退市。2、上市公司、上市公司股东或其他收购人通过向所有股东发出收购全部或部分......
  • Go:context.Context
    什么是context?context是Go标准库中用来管理任务生命周期和跨API数据传递的工具。它的主要应用场景是在并发编程中,尤其是处理像HTTP请求这样有超时限制或需要手动取消的任务。为了更通俗地理解,可以把context想象成一个任务的「管理员」,它可以:通知任务何时结束(比如超......
  • 1-2博客系统-登录注册页面第一关
    任务描述相关知识Bootstrap-validator的引用基本的页面结构Js的初始化编程要求代码实现任务描述本关任务:用Bootstrap-validator来验证表单。相关知识为了完成本关任务,你需要掌握:1.Bootstrap-validator的引用,2.基本的页面结构,3.Js的初始化。Bootstrap-validator的......