首页 > 编程语言 >Java异常处理:给程序罩一层保险

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

时间:2024-09-22 13:51:43浏览次数:3  
标签:一层 Java 处理 Cmower 程序 编译器 main 异常 public

编译器强制要求程序员为检查异常做预处理工作——捕获异常并处理或者抛出异常,否则编译器就会提示错误。常见的这类异常有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.使用日志记录异常的堆栈信息


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

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎徽关注公zhong号:编程进阶路 加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

,因为控制台记录的信息是有限的。

限于篇幅原因,日志相关的组件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 {

标签:一层,Java,处理,Cmower,程序,编译器,main,异常,public
From: https://blog.51cto.com/u_17015016/12080223

相关文章

  • JVM基础知识(二)Java内存模型
    java线程之可见性volatile不需要加锁,比synchronized更轻量级,不会阻塞线程;从内存可见性角度看,volatile读相当于加锁,volatile写相当于解锁。synchronized既能保证可见性,又能保证原子性;volatile只能保证可见性,无法保证原子性。同步退出同步块->释放监视器->刷......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript培训机构(画室)
    HTML+CSS+JS【培训机构】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • Java入门基础知识点整理大放送,赶紧收藏吧!
    浮点数:float??????4个字节double??8个字节布尔:boolean??1个字节引用类型:字符串String、类class、枚举enum、接口interface3、二进制(1)计算机中的数据都以二进制数据保存。(2)计算机信息的存储单位:位(bit):是计算机存储处理信息的最基本的单位字节(byte):一个字节有8个位组......
  • Java并发(六):ReentrantLock的解锁过程
    可以看到其调用的还是内部类sync的方法,而且可以看到这是一个无返回值的方法并且传入了一个为1的参数release方法可以看到,其调用的是AQS里面的release方法步骤如下先调用tryRelease方法,尝试进行解锁然后判断是否需要唤醒线程返回true,代表释放锁成功tryRelease方法......
  • Java开发八月七号下午笔试 面试
    SpringBoot有两种配置方式,properties和yml,两种配置方式只是格式上不同,功能是一致的,比如properties:server.port=8080对应的yml:server:port:8080就实际开发而言,yml更简洁一些,但是properties出错率更低一些。2、SpringBoot怎么修改启动时的端口号?(1)、在配置文件中修改端口号:......
  • 基于微信小程序的学生公寓电费信息管理系统+ssm(lw+演示+源码+运行)
    基于微信小程序的学生公寓电费信息管理系统摘要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,微信小程序被用户普遍使用,为方便用户能够可以随时进行小程序的相应信息内容的......
  • python+flask计算机毕业设计家庭财务管理系统APPy(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今社会,随着家庭经济活动的日益复杂和多元化,个人及家庭对于财务管理的需求日益增长。传统的手工记账方式已难以满足现代家庭对财务透明......
  • 【java面经速记】Mysql和ES数据同步
    目录Mysql业务数据库ES查询数据库数据同步方案同步双写异步双写(MQ方式)基于Mysql的定时扫描同步基于Binlog实时同步使用canal监听binlog同步数据到es(流行方案)拓展:mysql的主从复制原理canal原理:数据迁移同步工具Mysql业务数据库核心特点:开源免费、高并发、稳定、......
  • python+flask计算机毕业设计基于物联网技术的水质实时监测系统设计与实现(程序+开题+论
    文件加密系统的设计与实现tp835本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着工业化进程的加速和人口的不断增长,水资源的保护与监测日益成为全球关注的重大课题。水质污染问题不仅......
  • python+flask计算机毕业设计快递代取小程序(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今社会,随着电子商务的蓬勃发展,快递业务量急剧增长,成为了人们日常生活中不可或缺的一部分。然而,随之而来的“取件难”问题也日益凸显,尤......