java中的异常机制

异常原理分析

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

       异常的英文是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();
        }

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

硬盘日常使用中的注意事项

硬盘是计算机中的重要存储设备,负责存储大量的数据。为了确保数据的完整性和硬盘的寿命,日常使用中需要注意以下几点: 避免震动和撞击:硬盘在工作时,内部的磁盘正在高速旋转,任何轻微的震动或撞击都可能导致磁盘损坏或数据丢失。因此,使用硬盘时应确保计算机放置稳定,避…

Python图像处理【24】面部变形(face morphing)

面部变形 0. 前言1. 网格变形算法2. 实现面部变形小结系列链接 0. 前言 面部变形 (face morphing) 的目的是在计算图像中两个面部之间的平均值,它并不是计算两张图像的平均值,而是计算面部区域的平均值。可以将该过程分解为以下两步: 对齐两…

Docker容器化部署(企业版)

大家好,webfunny前端监控埋点系统,已经正式发布了webfunny的官方镜像: Webfunny镜像目录:https://hub.docker.com/r/webfunny/webfunny_monitor_cluster/tags 部署前提是你的服务器已经安装了Docker环境,没有安装doc…

车载电子电器架构 —— 售后诊断开发

车载电子电器架构 —— 售后诊断开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

OpenCV——Niblack局部阈值二值化方法

目录 一、Niblack算法1、算法概述2、参考文献二、代码实现三、结果展示OpenCV——Niblack局部阈值二值化方法由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、Niblack算法 1、算法概述 Niblack 算法是一种典型的局部阈值…

SpringMVC深解--一起学习吧之架构

SpringMVC的工作原理主要基于请求驱动,它采用了前端控制器模式来进行设计。以下是SpringMVC工作原理的详细解释: 请求接收与分发: 当用户发送一个请求到Web服务器时,这个请求首先会被SpringMVC的前端控制器(Dispatche…

VUE识别图片文字OCR(tesseract.js)

效果:1&#xff1a; 效果图2&#xff1a; 一、安装tesseract.js npm i tesseract.js 二、静态页面实现 <template><div><div style"marginTop:100px"><input change"handleChage" type"file" id"image-input"…

【数据结构项目】通讯录

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

Xilinx 7系列FPGA全局时钟缓冲器基本单元

Global Clock Buffer Primitives&#xff08;全局时钟缓冲器基本单元&#xff09;在FPGA&#xff08;现场可编程门阵列&#xff09;和其他数字系统中扮演着至关重要的角色。这些基本单元被设计用于处理、分配和增强时钟信号&#xff0c;以确保系统中的各个组件都能以精确和同步…

【Hadoop】- YARN架构[7]

前言 Yarn架构是一个用于管理和调度Hadoop集群资源的系统。它是Hadoop生态系统的一部分&#xff0c;主要用于解决Hadoop中的资源管理问题。 通过使用Yarn架构&#xff0c;Hadoop集群中的不同应用程序可以共享集群资源&#xff0c;并根据需要动态分配和回收资源。这种灵活的资…

4.21java聊天室项目小结

基本完成了用户的登录注册功能&#xff0c;可以实现用户账号登录和邮箱登录功能&#xff0c;忘记密码通过邮箱发送验证码找回&#xff0c;注册账号功能&#xff0c;并传递给客户端更新数据库的表内容 注册功能&#xff1a; 注册成功后密码进行MD5加密并通过服务器保存到数据库…

【STM32F4】STM32CUMX相关环境配置

一、环境配置 我们需要以下两个软件 &#xff08;一&#xff09;keil5 最正统&#xff0c;最经典的嵌入式MCU开发环境。 该环境的配置可以看看之前的文章 所需文件如下&#xff1a; 当时配置的是STC8H的环境&#xff0c;现在基于此&#xff0c;重新给STM32配置环境。能让STC…

Tricentis测试生成式人工智能系统和红队:入门指南

Tricentis测试生成式人工智能系统和红队:入门指南 测试人工智能并确保其责任、安全和保障的话题从未如此紧迫。自 2021 年以来,人工智能滥用的争议和事件增加了26 倍,凸显了日益增长的担忧。用户很快就会发现,人工智能工具并非万无一失。他们可能会表现出过度自信,并且缺…

ChatGPT研究论文提示词集合2-【形成假设、设计研究方法】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 目录 1.形成假设 2.设计研究方法 3.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程&#xff0c;精心准备一套学术研究各个流程的提示词集合。总共14个步骤&#…

11.接口自动化学习-Yaml学习

1.配置文件作用 配置文件项目角度&#xff1a; &#xff08;1&#xff09;现成的应用–第三方组件 mysql–数据库–my.conf tomcat–web服务器–server.xml 修改&#xff1a;连接数/端口 redis–缓存服务器–redis.conf 修改配置 jemeter–压测工具–jemeter.properties–修改…

PHP反序列化漏洞原理(附带pikachu靶场演示)

1.反序列化概念 序列化:是将变量转换为可保存或传输的字符串的过程;实现函数是serialize()反序列化:就是在适当的时候把这个字符串再转化成原来的变量使用&#xff0c;就是序列化的逆过程。实现函数是unserialize() 直白一点就是&#xff1a;序列化是把对象转换成字节流&#…

SpringMVC--RESTful

1. RESTful 1.1. RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 RESTful是一种网络架构风格&#xff0c;它定义了如何通过网络进行数据的交互。这种风格基于HTTP协议&#xff0c;使得网络应用之间的通信变得更加简洁和高效。…

python爬虫--------requests案列(二十七天)

兄弟姐们&#xff0c;大家好哇&#xff01;我是喔的嘛呀。今天我们一起来学习requests案列。 一、requests____cookie登录古诗文网 1、首先想要模拟登录&#xff0c;就必须要获取登录表单数据 登录完之后点f12&#xff0c;然后点击network&#xff0c;最上面那个就是登录接口…

数据结构––kmp算法(串)

kmp算法作为串的一个重要内容&#xff0c;必然有一定的难度&#xff0c;而在看到各类教辅书里的概念与解释后&#xff0c;其晦涩难懂的内容直接劝退一部分人&#xff0c;现在&#xff0c;让我们来看看吧 KMP解决的问题类型 KMP算法的作用就是在一个已知的字符串中查找子串的位…

布控球——防爆监控设备

控球&#xff0c;作为一种专为特定场景设计的防爆监控设备&#xff0c;主要用于在高风险、易燃易爆等特殊环境中提供实时、安全、高效的视频监控服务。其主要特点和功能如下&#xff1a; 防爆性能&#xff1a;布控球首先具备出色的防爆能力&#xff0c;外壳通常采用高强度、耐高…