filenotfoundexception是什么异常_Java异常处理:给程序罩一层保险
本着负责任的态度,我们程序员在写代码的时候,都非常的严谨。但程序在运行的时候,往往会出现一些令人意想不到的错误,导致那些不被期望的事件发生,最终,程序没有按照我们的预期正常地执行下去——异常发生了,是任程序自生自灭,还是将错误输出给用户?
Java为此提供的解决方案是——异常处理机制。
异常处理机制能够让程序在异常发生时,按照代码预先设定的异常处理规则,针对性地处理异常——要么恢复到程序一开始的样子,要么停止运行把详细的错误信息抛出来,让我们程序员知道哪里出了错,然后做出对应的优化。
人这一生,总会遇到一些不可预料的麻烦,这些麻烦可能会让我们遭受沉重的打击。为了减轻因此承受的负担,我们就会买保险。
异常处理机制在一定程度上保证了程序的健壮性,就好像给程序罩了一层保险。
01、 异常的分类
在Java中,异常被称为Throwable,可分为Error和Exception(英文直译为例外,但通常被称为真的‘异常’)。
Error:代表了Java虚拟机(Java Virtual Machine)本身的错误,不能通过代码进行处理。我们程序员最熟悉的Error就是OutOfMemoryError,该错误的原因是由于程序不严谨,产生了过多的垃圾,导致Java虚拟机内存溢出。
Exception:代表了程序运行时出现的各种例外(不被期望发生的事件),可分为检查(checked)异常和非检查(unchecked)异常。
编译器强制要求程序员为检查异常做预处理工作——捕获异常并处理或者抛出异常,否则编译器就会提示错误。常见的这类异常有SQLException、IOException和ClassNotFoundException。
编译器不会提示非检查异常,也不要求在程序中处理这些异常。但通常情况下,程序员应该对这些异常有所防范 。比如说在进行除法运算的时候要对除数进行检查,保证其不能为0,否则程序在运行时就会抛出ArithmeticException,如果这样的异常发生了,那只能说明编写这段代码的程序员很粗心。
可查看下图了解Java异常的分类:
02、 异常发生了
来看程序清单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 zeroat com.cmower.java_demo.twelve.Cmower.main(Cmower.java:6)*****************************************/
当除数为0时,将抛出ArithmeticException异常,程序不再继续执行——异常信息打印得非常详细,我们可以找到哪一行出了错,并且知道错误是由于除数为0引发的;假如不知道错误怎么解决,可以把第一行的错误信息复制粘贴进行搜索,有不少答案正是你需要的。
03 异常处理
程序清单3-1没有使用异常处理机制,也可以顺利编译,因为ArithmeticException异常是非检查异常。那如果遇到检查异常呢?
编译器会提醒异常未处理,见下图:
具体的代码如下:
public class Cmower {public static void main(String[] args) {FileInputStream fileIn = new FileInputStream("cmower.jpg");}}
那该如何处理异常呢?
如果是非检查异常,就需要在编码阶段对可能发生的错误进行规避,比如说,检查除数是否为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会隐藏掉那些应该呈现出来的信息。
04、 异常处理的实战
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)*****************************************/
05、 finally
对于一些代码,我们希望无论try块中的异常是否抛出,它们都能够得到执行,这就需要用到finally——不管异常是否发生,只要对应的try执行了,则它一定也执行。
finally块通常用来做资源释放操作:关闭文件、关闭socket连接、关闭数据库连接等等。示例如下:
try {Socket socket = new Socket(serverIp, serverPort);} catch (IOException e) {logger.error(e.getMessage(), e);} finally {socket.close();}
filenotfoundexception是什么异常_Java异常处理:给程序罩一层保险相关推荐
- JAVA报错是一层一层的吗_Java异常处理:给程序罩一层保险
本着负责任的态度,我们程序员在写代码的时候,都非常的严谨.但程序在运行的时候,往往会出现一些令人意想不到的错误,导致那些不被期望的事件发生,最终,程序没有按照我们的预期正常地执行下去--异常发生了,是 ...
- linux java url 异常_java异常处理总结
找到一个关于异常总结的很详细的文章,分享下.异常在我们编程中很重,在适当的位置,合理的处理或者抛出异常,对程序来说至关重要. 转:异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开 ...
- java 可控异常_java异常处理,重新认识java异常,java7异常处理的新特性!
原标题:java异常处理,重新认识java异常,java7异常处理的新特性! 在程序中,错误可能产生于程序员没有预料的各种情况,或者是超出了程序员可控范围的环境因素,如用户的坏数据.试图打开一个根本不 ...
- java除零异常_JAVA异常处理
出bug是写代码的时候非常常见的情况,今天就来讲一下. 首先明确一下什么是异常,代码正常运行不会出问题,但是遇到意外,参数变量,不符合要求,发生意外,代码终止运行,就是异常. 1.常见的异常有以下几种 ...
- 华为java敏感异常_JAVA 异常处理
1.异常:就是程序运行时出现不正常情况 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象.其实就是java对不正常情况进行描述后的对象体现. 对于问题的划 ...
- java 手动抛异常_Java 异常处理 之 手动抛出异常
一.手动抛出异常 throw 在编写程序时,我们必须要考虑程序出现问题的情况.比如,在定义方法时,方法需要接受参数.那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法 ...
- 黑马程序员_java异常处理机制
java异常处理机制 1:什么是异常? 异常(Exception)也叫例外.在Java编程语言中,异常就是程序在运行过程中由于硬件设备问题.软件设计错误.缺陷等导致的程序错误.在软件开发过程中,很多情 ...
- java 编写异常_Java基础编程之异常处理
Java异常类是对于程序中可能出现的错误或者异常的一种处理方式.在设计程序的过程中,对于可能出现的异常错误,比如说用户输入错误,设备错误,磁盘满了或者代码错误等等,通常采用异常处理的方式来进行处理可能 ...
- JAVA捕捉输入格式异常_Java学习(四).异常处理
异常处理 任何一个软件或程序都可能在运行的过程中出现故障,问题的关键是故障出现以后如何处理?谁来处理?怎样处理?处理后系统能否恢复正常的运行?本章在介绍Java处理这类问题基本方法的基础上,讨论包含异 ...
最新文章
- 【工具软件】Xmind的使用
- [bzoj2893] 集合计数
- 云湖共生-释放企业数据价值
- 使用双栈实现一个队列
- android tab pageview,Android Fragment在ViewPager中到底经历了什么?
- 红帽linux安装wordpress,linux Centos怎么安装wordpress
- ireport在Java中不展示_编译错误:ireport with java;属性'uuid'不允许出现在元素'jasperReport'中...
- 数组合并对象里相同属性值
- UVA#11584Partitioning by Palindromes
- Vue页面生成分享海报最详说明(含二维码+多种水印方式+常见的坑处理)
- 博世BMA400传感器API (中文说明)
- 空间数据挖掘中的Skyline查询
- Unknown module(s) in QT: webenginewidgets原因及解决办法
- mac 安装 qt5 for tsmuxer
- 十个Google关键词分析工具
- 开启智能生活新时代 河北省智慧社区建设从各个击破
- Java服务超时保护_五、服务保护-Hystrix
- 生于80,81,82,83年的十大尴尬
- 远程教育在线考试系统
- 如何计算心跳c语言编程,单片机心率计 电子脉搏计设计(原理图Protues仿真和C程序)...
热门文章
- pageSet的底层数据库存储逻辑
- SAP UI5 busy dialog released more often than required
- How change in Console is rendered back into UI
- How is data replicted from HANA to AS
- 给Sublime Text2安装GraphQL语法高亮插件
- Spring MVC原理学习之how is return type handled
- 如何在Chrome开发者工具里找出SAP Fiori frontend server的systen ID
- SAP在Kubernetes上打造的Kyma到底是个什么东东
- 一个SAP加拿大实习生在当地观察到的美景
- SAP S/4HANA里如何创建Customer主数据以及执行后续处理