什么是异常

在理想情况下,程序总会运行在很完美的环境中,网络不会终端,文件一定存在,程序不会有 BUG。但是,理想很丰满,现实很骨干,实际生产环境中,网络可能会中断,文件可能会找不到,内存可能会溢出,程序可能会有 BUG。而这些意料之外的情况就是异常。

在未处理的情况下,异常会导致程序无法继续执行,从而影响软件整体的功能,但这是多数情况下不允许的,所以我们需要在程序中将可处理的异常处理掉,至少保证当前任务可以安全退出。

Java 异常

Java 异常体系中,Throwable 为超类,其子类包括 Error 和 Exception 两类,Error 主要包括 JVM 本身的问题,这一类问题很少出现且无法被程序所解决,所以代码中可以不考虑此部分。

Java 异常体系将异常分为检查异常(checked exception)和未检查异常(unchecked exception)。

未检查异常也可叫做运行时异常,因为其在 Java 异常体系中仅包含 RuntimeException,主要包括代码编写时人为因为做成的异常,而这些异常在代码编译阶段无法发现,常见的有 IndexOutOfBoundsException、NullPointerException 和 IndexOutOfBoundsException 等,当出现未检查异常时可确定是代码 BUG。

检查异常包括除 RuntimeException 以外的所有异常,常见的主要为 IOException 和 SQLExcetion 两类,此部分异常虽然可能为人为造成,但在代码编译阶段就可以被编译器发现,所以需要在代码中做好相应的处理。

Java 异常处理

对应异常体系,Java 提供了异常处理机制,常用的关键字有 try、catch、finally、throw 和 throws。

try、catch 和 finally 的用法比较简单,只需要符合标准语法即可,try 对代码块进行监听,当出现异常时 catch 捕获异常进行异常处理,最后执行 finally 代码块。需要注意几个点:

  • 是无论是否出现异常,finally 代码块是一定执行,且在最后执行
  • catch 可以出现多次,但出现多次时需要注意异常的父子级关系,后面的异常不能为前面的子类
try{
// 代码块
} catch (异常){
// 异常处理代码
} finally {
// 需要确保一定执行的代码,例如关闭流资源占用的代码
}

throw 和 throws 比较容易混淆。throw 用于在代码中手动抛出异常,而 throws 则用于在方法签名后声明需要抛出的异常,涉及到继承关系时,子类方法抛出异常时,父类方法必须抛出异常,不能为子类异常的子类且数量不能少于子类,代码结构如下:

public void testMethod() throw Exception{
throw new RuntimeException();
}

Java 异常的使用建议

  • 仅当有需要或者能处理时对异常进行捕获,否则将异常抛向调用者,直至到与页面进行交互时统一处理或记录日志
  • finally 代码块建议只用来释放占用的资源,不要用来处理业务逻辑
  • 不要通过异常处理机制处理 RuntimeException,因为此类异常可以通过修改代码来解决,同时增加程序的健壮性
  • 异常处理记录日志时记录对问题排查有用的信息,无法确定时则将异常堆栈信息及方法运行参数记录下来
  • catch 捕获异常时粒度尽可能,例如捕获 FileNotFoundException 时不要用 IOException 代替
  • try 监听的代码尽可能少,不要将整个方法体都放在 try 语句中

每日一题:Java异常处理的更多相关文章

  1. Java实习生常规技术面试题每日十题Java基础(八)

    目录 1.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法. 2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 3.运行时异常与受检异常有 ...

  2. Java实习生常规技术面试题每日十题Java基础(四)

    目录 1.String 和StringBuffer的区别. 2.数组有没有length()这个方法? String有没有length()这个方法? 3.final, finally, finalize ...

  3. Java实习生常规技术面试题每日十题Java基础(七)

    目录 1. Java设计模式有哪些? 2.GC是什么?为什么要有GC? 3. Java中是如何支持正则表达式. 4.比较一下Java和JavaSciprt. 5.Math.round(11.5) 等于 ...

  4. Java实习生常规技术面试题每日十题Java基础(六)

    目录 1.在Java语言,怎么理解goto. 2.请描述一下Java 5有哪些新特性? 3.Java 6新特性有哪些. 4.Java 7 新特性有哪些. 5.Java 8 新特性有哪些. 6.描述Ja ...

  5. Java实习生常规技术面试题每日十题Java基础(五)

    目录 1.启动一个线程是用run()还是start()? . 2.线程的基本状态以及状态之间的关系. 3.Set和List的区别,List和Map的区别? 4.同步方法.同步代码块区别? 5.描述Ja ...

  6. Java实习生常规技术面试题每日十题Java基础(三)

    目录 1.是否可以从一个static方法内部发出对非static方法的调用? 2.Integer与int的区别? 3.Overload和Override的区别.参数列表相同,返回值不同的方法,是否是重 ...

  7. Java实习生常规技术面试题每日十题Java基础(二)

    目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...

  8. Java实习生常规技术面试题每日十题Java基础(一)

    目录 1.Java 的 "一次编写,处处运行"如何实现? 2.描述JVM运行原理. 3.为什么Java没有全局变量? 4.说明一下public static void main(S ...

  9. 【Java每日一题】20170106

    20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

随机推荐

  1. Word2010中插入多级列表编号

    https://jingyan.baidu.com/article/3ea5148901919752e61bbafe.html Word2010中插入多级列表编号的三种方法 听语音 | 浏览:8719 ...

  2. 阿里云域名和ip绑定步骤

    阿里云域名和ip绑定步骤 一.总结 一句话总结:域名转IP信息存在所在地运营商那,比如电信联通等. 1.给域名添加对应ip的过程叫做什么? 域名解析 2.域名解析中的记录代表什么意思,记录值呢? 记录 ...

  3. HDU2473 Junk-Mail Filter - 并查集删除操作(虚父节点)

    传送门 题意: 每次合并两份邮件,或者将某一份邮件独立出来,问最后有多少个邮件集合. 分析: 考虑初始化每个节点的祖先为一个虚父节点(i + n),虚父节点指向它自己.这样可以进行正常的合并操作. 而 ...

  4. Expression Blend 的点滴(1)--ListBox华丽大变身

    原文:Expression Blend 的点滴(1)--ListBox华丽大变身 最近,在园子里有不少朋友写了关于Blend的优秀并且实用的文章,在此,我先代表silverlight的爱好者感谢他们的 ...

  5. python 使用顺序表实现栈和队列

    栈: # -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/24 下午 2:33 # 采用list(顺序表)实现栈结构,后入先出 clas ...

  6. 过滤Filter推断用户是否登录

    WEB.XML <!-- 用户session的 键 sessionKEY --> <context-param> <param-name>userSessionKe ...

  7. 【a803】营救

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 铁达尼号遇险了!它发出了求救信号.距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里.通过侦测, ...

  8. java序列化框架(protobuf、thrift、kryo、fst、fastjson、Jackson、gson、hessian)性能对比

     我们为什么要序列化 举个栗子:下雨天我们要打伞,但是之后我们要把伞折叠起来,方便我们存放.那么运用到我们java中道理是一样的,我们要将数据分解成字节流,以便存储在文件中或在网络上传输,这叫序列 ...

  9. windows下Eclipse启动tomcat提示port已被占用 already in use

    >netstat -ano | findstr 8009 TCP    127.0.0.1:8005         0.0.0.0:0              LISTENING       ...

  10. python 读写XLS

    需要库: xlrd, xlwt, xlutils 导入 import xlrd from xlutils.copy import copy 打开文件 data = xlrd.open_workbook ...