java中的异常机制

news2024/10/2 6:27:10

异常原理分析

        在我们编写一个代码的时候必然会出现这样那样的问题,这些问题可能是明显的,也有可能是不明显的。从理论上来说,一个程序员应当具备处理代码出现的大多数问题的能力,但是这并不意味着程序员要思考处理所有的代码问题。假如一个程序员要思考并解决所写代码的所有问题的话,那么不仅程序员要耗费大量的时间与精力,编写代码的效率也会大大降低,这样对一个公司的产出是非常不利的。因此,在变成语言中大多会加上一些对常见异常的处理手段。

       异常的英文是Exception,翻译为例外,说的就是正常情况之外的情况,故异常指的是程序在运行过程中出现的非正常情况,例如用户输入不合规数据、除数为零、需要处理的文件不存以及数组的下标越界等情况。一般情况之下,运行中的程序在遇到这些情况时会直接报错,然后在遇到异常的地方停止执行代码,退出程序。在实际编程中,程序员一般不希望出现这种情况,当然对于整个公司来说更不愿意出现这种代码遇到异常直接退出运行的情况。这里打一个不是很恰当的比方,现在很多人都玩游戏,而在游戏中或多或少都会遇到bug,如果在玩家遇到bug时游戏直接退出了,而当玩家再次登录时很大概率会重复触发bug,于是玩家会再次退出,由此陷入死循环,这样不仅玩家的游戏体验非常糟糕,对于游戏开发公司来说也是一次致命的错误。因此游戏开发公司希望的是,即使遇到一个小bug游戏依然能正常运行。

        所以异常的处理指的就是即使程序出现问题,但是程序依旧可以完整走完。比如我们对比一下两个程序的运行结果,第一个程序没有进行异常处理,这时程序在遇到异常后就停止了,并没有执行异常之后的代码:System.out.println("step2");,而当进行异常处理之后,代码继续执行异常之后的代码,运行结果后面会打印出异常信息。

package cn.test.exception;

public class Test04 {
    public static void main(String[] args) {
        System.out.println("step1");
        int a = 2/0;
        System.out.println("step2");
    }
}

package cn.test.exception;

public class Test04 {
    public static void main(String[] args) {
        System.out.println("step1");
        try{
            int a = 2/0;
        }catch (Exception e){
            e.printStackTrace();//打印错误信息
        }
        System.out.println("step2");
    }
}

异常处理

        java中,JDK定义了很多的异常类,这些异常类都是Throwable类的子类,具体可以分为Exception和Error两大类,其中Exception类又可以分为CheckedExcception和UncheckedException两大类。在这两大类中CheckedException类中定义了非常多的异常,但是这些异常一般通不过编译,也就是编译时系统就能检查出异常来,而UncheckedException中只有RuntimeException这一类,这个类中的异常是运行时的异常,在编译时并不会被发现,比如上面的例子中 a = 2/0;这一行的异常就属于这一类。Error类的异常已经超出了程序员要处理的范畴,它表示的java本身运行的异常,是系统的原因。因此总结下来,java中的异常处理目前只有UncheckedException类中的RunException。

        java中对异常的处理除了程序员手动排除,对代码进行修改,使程序符合现实逻辑外,还有捕获异常、声明异常以及try-with-resourse三种方式。

异常捕获

        语法结构

        捕获异常通过trw-catch-finally关键字来执行,它的语法结构为:

                        try{

                                语句1;

                                语句2;

                        }catch(Exception1 e){

                        }catch(Exception2 e){

                        }finally{

                        }

其中,try结构是用来执行程序语句的,如果语句中出现异常,系统会抛出异常,随后catch会对系统抛出的异常进行捕获并处理。在这里如果出现的多个异常之间存在关系,则遵循子类在前,父类在后的异常捕获方式。最后,finally语句为捕获的异常提供了一个统一的处理出口,finally语句最多只能有一条,可以没有,但是一旦finally中拥有语句,则这个语句必须被执行,finally结构中的语句一般用于关闭资源。

        在上面的这个语句结构中,有一点要注意的是,当try结构中的语句1出现异常后可能会抛出一个或者几个异常,当出现异常后语句2是被跳过的,并不会被执行,即使异常处理结束了也不会回去执行语句2,要排除Excepton1是语句1的异常,Exception2是语句2的异常的这种错误想法。

        演示代码

package cn.test.exception;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Test01 {

    public static void main(String[] args) {
        FileReader reader = null;
                try {
                    reader = new FileReader("F:/a.txt");
                    char c = (char)reader.read();
                    char c1 = (char)reader.read();
                    System.out.println(""+c+c1);
                }catch ( FileNotFoundException e){
                    e.printStackTrace();
                } catch (IOException e){
                    e.printStackTrace();
                }finally{
                    try{
                        if(reader != null){
                            reader.close();
                        }
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }

    }
}

 异常声明

        概述

        用异常的声明的方式来处理异常的方法是通过关键字throws关键字来实现的,这种处理异常的方法一般用于java中的方法中,在方法后面添加throws Exception即可将方法体中的异常进行“抛出”处理。异常声明的方式是在异常捕获的基础上实现的,采用异常声明的时候方法体语句中就没了catch语句,但是try语句是必不可少的。

        异常声明的方式处理异常最简单的理解方式就是请别人帮你解决问题,将难题抛给别人。因此不是问题不处理,而是把问题交给别人处理而已,比如我们将上面的那个程序中读取文件的部分封装为一个方法,在这个方法中将异常用关键字throws关键字抛出,这时如果我们在main方法中调用该方法,则系统会提示异常,这时就需要我们在main方法中处理异常。同样,在main方发中也可以选择用异常的捕获处理异常,也可以再次将异常抛出,但是在main方法中将异常抛出不是很规范,可以用,但不建议。

        演示代码

package cn.test.exception;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Test02 {
    public static void main(String[] args) {
        try {
            readFile("F:/a.txt");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void readFile(String path) throws Exception {
        FileReader reader = null;
        try {
            reader = new FileReader(path);
            char c = (char) reader.read();
            char c1 = (char) reader.read();
            System.out.println("" + c + c1);

        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

try-with-resource

        try-with-resourcre是JDK7之后出现的一种新的结构,不过说是新的结构其实是对异常捕获的语法结构进行了简化。在异常捕获的语法结构中finally中的内容一般是对已经打开的资源进行关闭操作,以免导致外部资源泄露的问题。但是每一次进行异常处理都需要手动写代码对资源进行关闭无形中增加了程序员的冗杂的工作内容,那么可不可以让它自动关闭呢?于是try-with-resource结构就出现了,在这个结构中,省略了finally的部分,在进行异常处理后,打开的资源会直接被关闭。而这种省略只是在程序员的书写中表现出来而已,编译的时候体现的仍然是异常捕获的代码,也就是说系统自动在代码中添加了finally的部分。

package cn.test.exception;

import java.io.FileReader;

public class Test02 {
    public static void main(String[] args) {
        try(FileReader reader = new FileReader("F:/a.txt")){
            char  c = (char)reader.read();
            char c1 = (char)reader.read();
            System.out.println(""+c+c1);
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始的vscode配置及安装rust教程

配置vscode的rust环境 下载安装vscodemac 环境1. 下载安装rust2. 配置 mac vscode环境3. 创建一个测试项目 windows 环境1. 安装c运行环境2. 安装配置rustup3. 配置windows vscode环境4. 创建一个测试项目 下载安装vscode 1.官网应用程序下载 vscode:https://code.v…

Mogdb 5.0新特性:SQL PATCH绑定执行计划

前言 熟悉Oracle的dba都知道,生产系统出现性能问题时,往往是SQL走错了执行计划,紧急情况下,无法及时修改应用代码,dba可以采用多种方式针对于某类SQL进行执行计划绑定,比如SQL Profile、SPM、SQL Plan Base…

Git多人协作开发

1、创建分支(在码云上) (1)在本地查看我们本地指向远程的分支:git branch -r (2)我们在码云上新建了个dev分支,我们将dev分支拉取到本地:git pull (3&#…

2.1K Star微软开源的高质量 iot库

功能描述 该项目是一个开源的 .NET Core 实现,旨在帮助开发者构建适用于物联网(IoT)设备和场景的应用程序。它提供了与传感器、显示器和输入设备等相互作用所需的 GPIO 引脚、串口等硬件的接口。该仓库包含 System.Device.Gpio 库以及针对各种板卡(如 Ra…

学习51单片机 C语言知识

一、数据类型 C 语言包含的数据类型如下图所示 C51 的数据类型分为基本数据类型和组合数据类型,情况与标准 C 中的数据类型基本相同,但其中 char 型与 short 型相同,float 型与 double 型相同,另外,C51 中还有专门针…

大多企业搞错了!TRIZ的培训不是目的,应用才是

近年来,企业对于员工的培训投入越来越大,尤其是在引入TRIZ等先进方法论方面。然而,许多企业在实施过程中却陷入了一个误区:将培训本身视为目的,而非将其应用于实际工作和问题解决中。天行健六西格玛培训公司解析如下&a…

【未完成】【QT+OpenCV】车牌号检测 学习记录 遇到的问题

【QTOpenCV】车牌号检测 学习记录 首先在QT里面配置好OpenCV .pro文件中加入: INCLUDEPATH G:/opencv/build/include LIBS -L"G:/opencv/build/x64/vc14/lib"\-lopencv_core \-lopencv_imgproc \-lopencv_highgui \-lopencv_ml \-lopencv_video \-lo.c…

Python 全栈安全(三)

原文:annas-archive.org/md5/712ab41a4ed6036d0e8214d788514d6b 译者:飞龙 协议:CC BY-NC-SA 4.0 第十一章:OAuth 2 本章内容 注册 OAuth 客户端 请求对受保护资源的授权 授权而不暴露身份验证凭据 访问受保护的资源 OAuth …

Python 全栈安全(四)

原文:annas-archive.org/md5/712ab41a4ed6036d0e8214d788514d6b 译者:飞龙 协议:CC BY-NC-SA 4.0 第十五章:内容安全策略 本章涵盖 使用 fetch、navigation 和 document 指令编写内容安全策略 使用 django-csp 部署 CSP 使用报…

【C++】学习笔记——类和对象_3

文章目录 二、类和对象11. 析构函数(补)12. 拷贝构造函数13. 运算符重载 未完待续 二、类和对象 11. 析构函数(补) 析构函数并不是销毁对象,对象的销毁是由编译器完成的,析构函数的作用是清理&#xff0c…

java-Spring-bean的生命周期

定义 程序中的每个对象都有生命周期,对象的创建、初始化、应用、销毁的整个过程称之为对象的生命周期; 在对象创建以后需要初始化,应用完成以后需要销毁时执行的一些方法,可以称之为是生命周期方法; 在spring中&…

<计算机网络自顶向下> 可靠数据传输的原理

可靠数据传输(rdt:Reliable Data Transfer)的原理 rdt在应用层,传输层和数据链路层都很重要是网络TOP10问题之一信道的不可靠特点决定了可靠数据传输rdt的复杂性rdt_send: 被上层(如应用层)调用&#xff0…

AI安全之问:我们的智能助手真的安全吗?

在我们日益依赖人工智能来撰写文档、编写程序代码、甚至创作艺术作品的今天,我们是否曾经想过这些智能系统可能面临的被恶意操纵的风险? 分享几个网站 GPT-3.5研究测试: https://hujiaoai.cn GPT-4研究测试: https://higpt4.cn…

【数据结构项目】通讯录

个人主页点这里~ 原文件在gitee里~ 通讯录的实现 基于动态顺序表实现通讯录项目1、功能要求2、代码实现file.hfile.cList.hList.ctest.c 基于动态顺序表实现通讯录项目 准备:结构体、动态内存管理、顺序表、文件操作 1、功能要求 ①能够存储100个人的通讯信息 ②…

刷代码随想录有感(41):二叉树最小深度

题干: 代码: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), …

CK_Label_V1

CK_Label_v1(电池版) 产品型号 CK_Label_v1 尺寸 37*65*33.7mm 按键 1 指示灯 1 RGB灯(红/绿/蓝/黄/紫/白/青) 外观颜色 白色 供电方式 5号干电池供电1800mAh,可更换电池 通信方式 无线通信 合规认证 CE, RoHS 工作温度 …

FebHost:CC域名商业和非商业使用的区别

在当今互联网的世界中,域名的选择不仅关乎一个网站的在线身份,更与其背后的商业策略紧密相连。.cc 顶级域(TLD)作为众多选择之一,其使用方式可分为商业和非商业两大类。 商业用途:当提及.cc域名的商业用途…

使用yum安装pt-query-digest 并分析MySQL慢查询日志

查看慢SQL日志 1、查看慢日志设置 show variables like slow_query_log%; 2、设置慢日志开关 -- 关闭 SET GLOBAL slow_query_log OFF; -- 开启 SET GLOBAL slow_query_log ON; 3、查看慢日志阈值,即SQL执行时间超过阈值后,才会记录在慢日志文件中 …

Springboot的Test单元测试操作

Springboot的Test单元测试操作 简单总结需要操作的步骤 1&#xff0c;导入依赖 2&#xff0c;创建目录&#xff08;目录和启动类的目录保持一致&#xff09; 3&#xff0c;添加注解 4&#xff0c;写方法测试 1&#xff0c;导入依赖 <dependency><groupId>org.spri…

春游江淮 请来池州 | 3天2晚 您的专属高铁游线路来啦

“快乘高铁 趣游池州”3天2晚高铁游主题线路来喽! 各位旅客朋友请注意,连接九华山、黄山、太平湖“两山一湖”的“黄金旅游线”池黄高铁已进入开通倒计时! 本次列车共设池州、九华山、黄山西、黟县东4站。始发站池州,趁着春意正浓,和我们一起快乘高铁,趣游池州吧! DAY1 上午…