Java异常处理:给程序罩一层保险

Exception in thread "main" java.lang.NullPointerException 希望高手指点 立即下载

人这一生,总会遇到一些不可预料的麻烦,这些麻烦可能会让我们遭受沉重的打击。为了减轻因此承受的负担,我们就会买保险。

本着负责任的态度,我们程序员在写代码的时候,都非常的严谨。但程序在运行的时候,往往会出现一些令人意想不到的错误,导致那些不被期望的事件发生,最终,程序没有按照我们的预期正常地执行下去——异常发生了,是任程序自生自灭,还是将错误输出给用户?

Java为此提供的解决方案是——异常处理机制。

异常处理机制能够让程序在异常发生时,按照代码预先设定的异常处理规则,针对性地处理异常——要么恢复到程序一开始的样子,要么停止运行把详细的错误信息抛出来,让我们程序员知道哪里出了错,然后做出对应的优化。

异常处理机制在一定程度上保证了程序的健壮性,就好像给程序罩了一层保险。

Java异常处理:给程序罩一层保险

一、异常的分类

在Java中,异常被称为Throwable,可分为Error和Exception(英文直译为例外,但通常被称为真的‘异常’)。

Error:代表了Java虚拟机(Java Virtual Machine)本身的错误,不能通过代码进行处理。我们程序员最熟悉的Error就是OutOfMemoryError,该错误的原因是由于程序不严谨,产生了过多的垃圾,导致Java虚拟机内存溢出。

Exception:代表了程序运行时出现的各种例外(不被期望发生的事件),可分为检查(checked)异常和非检查(unchecked)异常。

编译器强制要求程序员为检查异常做预处理工作——捕获异常并处理或者抛出异常,否则编译器就会提示错误。常见的这类异常有SQLException、IOException和ClassNotFoundException。

编译器不会提示非检查异常,也不要求在程序中处理这些异常。但通常情况下,程序员应该对这些异常有所防范 。比如说在进行除法运算的时候要对除数进行检查,保证其不能为0,否则程序在运行时就会抛出ArithmeticException,如果这样的异常发生了,那只能说明编写这段代码的程序员很粗心。

可查看下图了解Java异常的分类:

Java异常处理:给程序罩一层保险

二、异常发生了

来看程序清单3-1:

package com.cmower.java_demo.twelve;
public class Cmower {
    public static void main(String[] args) {
        System.out.println(2 / 0);
        System.out.println("程序已终止执行");
    }
}
/*****************************************
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at com.cmower.java_demo.twelve.Cmower.main(Cmower.java:6)
*****************************************/

当除数为0时,将抛出ArithmeticException异常,程序不再继续执行——异常信息打印得非常详细,我们可以找到哪一行出了错,并且知道错误是由于除数为0引发的;假如不知道错误怎么解决,可以把第一行的错误信息复制粘贴进行搜索,有不少答案正是你需要的。

三、异常处理

程序清单3-1没有使用异常处理机制,也可以顺利编译,因为ArithmeticException异常是非检查异常。那如果遇到检查异常呢?

编译器会提醒异常未处理,见下图:

Java异常处理:给程序罩一层保险

那该如何处理异常呢?

如果是非检查异常,就需要在编码阶段对可能发生的错误进行规避,比如说,检查除数是否为0,如果为0就不要再做除法运算了。

如果是检查异常,做法大致有两种。

1.直接抛出错误

大学快毕业的时候,我感觉很迷茫,不知道未来要做什么,于是就打电话向父母求助,他们就劝我去一家软件培训园接受培训——自己决定不了的,就向上级请示。

这种现实的场景在Java中竟然也能找到相似之处。当一个方法不知道该怎么处理异常时,就可以使用throws关键字将编译器提醒的错误抛出,抛出的错误直接交给方法调用者来处理。示例如下:

public class Cmower {
    public static void main(String[] args) throws FileNotFoundException {
        FileInputStream fileIn = new FileInputStream("cmower.jpg");
    }
}

2.捕获错误

这种现实的场景在Java中仍然能找到相似之处。当一个方法知道自己该怎么处理异常时,就可以使用try块将编译器提醒出错的代码段进行捕获,然后在catch块中做出对应的处理。示例如下:

public class Cmower {
    public static void main(String[] args) {
        try {
            FileInputStream fileIn = new FileInputStream("cmower.jpg");
        }
        catch (FileNotFoundException e) {
            System.err.println("读取的文件未找到:" + e.getMessage());
        }
    }
}

在我初学Java的时候,总喜欢直接捕获通用异常Exception,而不是特定的异常(比如FileNotFoundException),因为这样做很省事,除了少写几个字母之外,还不必担心其他异常出现时再另外捕获。

但这样做是有问题的。因为在日常的开发中,我们希望代码能够直观地体现出尽量多的信息,但不具体的Exception会隐藏掉那些应该呈现出来的信息。

四、异常处理的实战

1.表单验证

当我们需要在服务器端对用户输入的内容进行检查时,就可以利用异常处理机制。怎么做呢?

第一步,自定义异常类,继承RuntimeException(那些不受检查的异常类都继承自该类)。

public class OrderException extends RuntimeException {
    public OrderException() {
        super();
    }
    public OrderException(String message) {
        super(message);
    }
}

第二步,表单验证的时候,遇到不符合要求的用户输入时使用throw关键字抛出自定义异常。

public static void check(String input) {
    if (input == null) {
        throw new OrderException("输入值不能为空");
    }
    if (input.length() < 10) {
        throw new OrderException("字符串长度不能少于10个");
    }
}

第三步,对自定义异常捕获,做出对应处理。

public class Cmower {
    public static void main(String[] args) {
        try {
            check(args[0]);
        }
        catch (OrderException e) {
            System.err.println("用户输入条件有误:" + e.getMessage());
        }
    }
}

为什么要使用自定义异常来处理用户输入呢?因为用户输入需要检查很多项,而异常处理机制会在遇到第一项错误的时候就停下来,后面的代码是不会执行的——很贴合表单验证的场景。

2.使用日志记录异常的堆栈信息

在之前的例子当中,我们一直把错误信息打印在控制台,但正式的应用当中,日志是要被记录在日志文件中的,因为控制台记录的信息是有限的。

限于篇幅原因,日志相关的组件log4j、slf4j以及他们在项目中的配置请查阅资料。

当配置好日志组件后,就可以在需要记录日志信息的类中创建Logger,然后在catch块中使用logger.error(e.getMessage(), e);记录详细的异常堆栈信息。具体示例如下:

package com.cmower.java_demo.twelve;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Cmower {
    protected static Logger logger = LoggerFactory.getLogger(Cmower.class);
    public static void check(String input) {
        if (input == null) {
            throw new OrderException("输入值不能为空");
        }
        if (input.length() < 10) {
            throw new OrderException("字符串长度不能少于10个");
        }
    }
    public static void main(String[] args) {
        try {
            check(null);
        }
        catch (OrderException e) {
            logger.error(e.getMessage(), e);
        }
    }
}
/*****************************************
ERROR 2019-01-08 21:38:35,696 com.cmower.java_demo.twelve.Cmower: 输入值不能为空
com.cmower.java_demo.twelve.OrderException: 输入值不能为空
    at com.cmower.java_demo.twelve.Cmower.check(Cmower.java:10)
    at com.cmower.java_demo.twelve.Cmower.main(Cmower.java:20)
*****************************************/

五、finally

对于一些代码,我们希望无论try块中的异常是否抛出,它们都能够得到执行,这就需要用到finally——不管异常是否发生,只要对应的try执行了,则它一定也执行。

finally块通常用来做资源释放操作:关闭文件、关闭socket连接、关闭数据库连接等等。示例如下:

try {
    Socket socket = new Socket(serverIp, serverPort);
}
catch (IOException e) {
    logger.error(e.getMessage(), e);
}
finally {
    socket.close();
}
简单保险系统 本资源为数据库课程的课程设计,采用java语言编写。因为java的GUI日渐没落,推荐大家重点看对数据库的操作部分,这也是我花费精力最多的地方。有不足之处欢迎指正。 立即下载

相关推荐

从手机到自动驾驶:MIPI-CSI2协议演进史与车规级改造要点

本文追溯了MIPI-CSI2协议从智能手机摄像头到自动驾驶核心传感器的演进历程。重点剖析了该协议在车规级改造中面临的严苛挑战,包括物理层稳定性、EMC防护、功能安全与数据可靠性等关键要点,并探讨了其在多传感器融合与高带宽实时传输中的工程实践。

weixin_28318011的博客 308

Exception in thread "main" java.lang.ArithmeticException: / by zero 小结 2020.01.29

这篇文章的名字或许也可以叫做----- 数据中明明没有0 却报错 Exception in thread “main” java.lang.ArithmeticException: / by zero 今天遇到一个问题,Java报错 / by zero,查了老半天,都是一些什么,除数为0,模0之类的(/0,%0),并没有解决我的问题。也与很多群友进行了讨论,讨论内容涉及报错的解决,背后的原理,甚...

我是你的橙子啊 3825

基于人脸识别的智能门禁系统设计

在当前的技术背景下,本文精心打造了一款前沿的视频识别门禁控制系统。在进行调试的时候使用的软件是Keil,编写完代码,生成文件后用下载器下载到单片机上,就能够进行程序的调试了,本次设计实现了预先设定的目标,达到了预期的效果。本次设计的人脸识别的门禁控制系统其硬件部分是以STM32F103C8T6为核心的单片机,采用0V2640摄像头对人员的人脸识别,采用矩阵按键对系统的操作以及密码的输入,使用蜂鸣器来作为报警模块,开门装置是电子锁控制,显示设备采用OLED液晶显示,无线模块在一番思索后选择了蓝牙模块传输。

2401_86147581的博客 1296

Exception in thread “main“ java.lang.ArithmeticException: / by zer

错误信息如下: Exception in thread "main" java.lang.ArithmeticException: / by zero at ForText06.main(ForText06.java:46) 原因如下: 当我们定义的被除数为整形时候(short int long)会抛出此异常,被除数为整形时不可以为零。 错误代码如下: int i 跟 int j 不能被定义为0,原因是当if执行的时候会抛出异常,因为是0,没办法被整除。 for(int i = 0; i &

zxh7770的博客 4551

保姆级教程:在S32K312上配置C40驱动,实现Flash读写(基于RTD 4.4.2)

本文详细介绍了在S32K312微控制器上配置C40驱动实现Flash读写的全流程,基于RTD 4.4.2库。内容涵盖环境搭建、外设配置、Flash操作实战代码及高级应用场景,特别针对LLD驱动和FLS存储操作中的常见问题提供了解决方案,帮助开发者快速掌握嵌入式Flash存储技术。

weixin_28684757的博客 256

【深度学习新浪潮】Score Matching(分数匹配):原理、推导与PyTorch实战

在概率模型训练中,配分函数(归一化常数)是绕不开的难题——尤其是能量模型(EBM)、扩散模型等未归一化模型,直接计算配分函数几乎不可能。Score Matching(分数匹配)作为一种无归一化的参数估计方法,通过拟合概率密度的对数梯度(分数函数),彻底避开了配分函数的计算,成为生成建模、密度估计的核心技术之一。本文将从基础概念出发,逐步推导Score Matching的核心公式,并结合PyTorch实现一个可直接运行的实战案例,帮你彻底理解这一关键技术。Score Matching的核心是。

专注:太空算力、AI infra、异构调度、大模型成本工程 250

java.lang.ArithmeticException: / by zero 异常处理

当定义的 ”被除数 ” 为整形时候(short int long)会抛出此异常,被除数为整形时不可以为零。

qq_41814311的博客 1万+

FCTA/FCTB 前方交通穿行预警/制动系统技术规范

FCTA&FCTB前方交叉路口预警制动系统是针对十字路口和停车场等"鬼探头"场景设计的驾驶辅助系统。系统在自车速度0-40km/h范围内工作,通过角雷达和摄像头检测侧向来车.

未知艺术家的博客 743

Java小白常见异常|ArithmeticException算数异常的解决过程

通过这个案例,我们会发现,在学习的过程中,我们的基础知识一定要牢固!基础知识薄弱的童鞋,可以联系我获取免费基础资料。如果你还有其他问题,可以在评论区给我留言,壹哥看到了会及时给你解答。

一一哥 5047

智能合约监控告警:提示工程架构师用AI Prompt实现精准预警

当AI大模型(尤其是代码理解模型如CodeLlama、GPT-4 Code)与区块链数据结合,智能合约监控迎来范式革新。AI模型如何精准理解智能合约的业务特殊性?如何避免"AI幻觉"导致的误报?如何让模型学会区分"正常异常"与"攻击前兆"?答案藏在"提示工程"(Prompt Engineering)中。理解特定智能合约的业务逻辑(如DeFi协议的清算机制、NFT的铸造规则)识别复杂的攻击模式(如重入攻击的调用链特征、闪电贷的套利路径)结合链上链下数据进行多维度推理(如关联价格波动与异常交易)

AI架构全栈开发实战笔记 1011

【心电信号】基于多种滤波去除心电信号基线漂移含Matlab源码

1 简介 心电信号可以用来检测和诊断心脏疾病,心电信号在采集时经常受到呼吸活动、身体运动和皮肤与电极接触不良等影响,因此会产生基线漂移,基线漂移的存在会降低心电信号的质量。所以,在大多数心电信号处理中,包括心律失常的识别、心率变化分析和连续血压测量等,去除基线漂移成为了至关重要的一步。心电信号具有非平稳、非线性的特性,传统的去除心电信号中基线漂移的方法在对心电信号进行去噪时常因去噪过度或者不完全,容易造成大量非线性特征信息的丢失,从而破坏了心电信号本身的动力学特性,这给后续的心电信号信息分析带来了不利影响

qq_59747472的博客 2209

filenotfoundexception是什么异常_Java异常处理:给程序罩一层保险

本着负责任的态度,我们程序员在写代码的时候,都非常的严谨。但程序在运行的时候,往往会出现一些令人意想不到的错误,导致那些不被期望的事件发生,最终,程序没有按照我们的预期正常地执行下去——异常发生了,是任程序自生自灭,还是将错误输出给用户?Java为此提供的解决方案是——异常处理机制。异常处理机制能够让程序在异常发生时,按照代码预先设定的异常处理规则,针对性地处理异常——要么恢复到程序一开始的样子,...

weixin_42133918的博客 3623

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JAVA报错是一层一层的吗_Java异常处理:给程序罩一层保险

本着负责任的态度,我们程序员在写代码的时候,都非常的严谨。但程序在运行的时候,往往会出现一些令人意想不到的错误,导致那些不被期望的事件发生,最终,程序没有按照我们的预期正常地执行下去——异常发生了,是任程序自生自灭,还是将错误输出给用户?Java为此提供的解决方案是——异常处理机制。异常处理机制能够让程序在异常发生时,按照代码预先设定的异常处理规则,针对性地处理异常——要么恢复到程序一开始的样子,...

weixin_39942637的博客 196

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

socket在哪一层_Java异常处理:给程序罩一层保险

本着负责任的态度,我们程序员在写代码的时候,都非常的严谨。但程序在运行的时候,往往会出现一些令人意想不到的错误,导致那些不被期望的事件发生,最终,程序没有按照我们的预期正常地执行下去——异常发生了,是任程序自生自灭,还是将错误输出给用户?Java为此提供的解决方案是——异常处理机制。异常处理机制能够让程序在异常发生时,按照代码预先设定的异常处理规则,针对性地处理异常——要么恢复到程序一开始的样子,...

weixin_39723010的博客 134

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java异常处理:给程序罩一层保险,java面试常见问题

/***************************************** Exception in thread “main” java.lang.ArithmeticException: / by zero at com.cmower.java_demo.twelve.Cmower.main(Cmower.java:6) *****************************************/ 当除数为0时,将抛出ArithmeticException异常,程序不再继续执行——异常

m0_64867220的博客 163

java 代码段 执行超时 抛异常_Java异常处理:给程序罩一层保险

文/沉默王二人这一生,总会遇到一些不可预料的麻烦,这些麻烦可能会让我们遭受沉重的打击。为了减轻因此承受的负担,我们就会买保险。本着负责任的态度,我们程序员在写代码的时候,都非常的严谨。但程序在运行的时候,往往会出现一些令人意想不到的错误,导致那些不被期望的事件发生,最终,程序没有按照我们的预期正常地执行下去——异常发生了,是任程序自生自灭,还是将错误输出给用户?Java为此提供的解决方案是——异常...

weixin_39968436的博客 139

异常处理(为程序上一层保险)

(1)异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的 (2)异常的原因: 用户输入了非法数据。 要打开的文件不存在。 网络通信时连接中断,或者JVM内存溢出。 (3)异常分级: 所有的异常类是从 java.lang.Exception 类继承的子类。 当输入不合法时,使程序抛出异常,可以终止程序的运行: public class HelloWord { pu...

匿名攻城狮 771
上一篇: Java工程师的职业生涯应该如何规划
下一篇: 什么是JPA?Java Persistence API简介
大G哥
博客等级 码龄9年 5303粉丝 1408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值