什么是异常

在理想情况下,程序总会运行在很完美的环境中,网络不会终端,文件一定存在,程序不会有 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. 基于 MySQL 5.6 keepalived的双主搭建

    环境介绍: 说明 IP 节点1 192.168.56.56 节点2 192.168.56.57 w_ip 192.168.56.6 安装keepalived tar -zxvf keepalived- ...

  2. spring boot中servlet启动原理

    启动过程及原理 1 spring boot 应用启动运行run方法 StopWatch stopWatch = new StopWatch(); stopWatch.start(); Configur ...

  3. Android接口安全 - RSA+AES混合加密方案

    转载请注明出处: http://blog.csdn.net/aa464971/article/details/51034462 本文以Androidclient加密提交数据到Java服务端后进行解密为 ...

  4. window对象属性alert、confirm、prompt怎么使用?

    window对象属性alert.confirm.prompt怎么使用? 一.总结 1.参数依次复杂,返回值依次复杂,但是感觉都是一一继承的,所以很好想也很好写. 二.window对象alert.con ...

  5. 微信小程序从零开始开发步骤(一)

    从零到有写一个小程序系列专题,很早以前就想写来分享,但由于项目一直在进展,没有过多的时间研究技术,现在可以继续分享了.1:注册用没有注册过微信公众平台的邮箱注册一个微信公众号, 申请帐号 ,点击 ht ...

  6. 【t080】遗址

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 很久很久以前有一座寺庙,从上往下看寺庙的形状正好是一个正方形,在4个角上竖立着圆柱搭建而成.现在圆柱都 ...

  7. [Angular] @ContentChild and ngAfterContentInit

    @ContentChild normally works with ngAfterContentInit lifecycle. @ContentChild is used for looking in ...

  8. gen_server的enter_loop分析

    http://my.oschina.net/astute/blog/119250?p=1 在看ranch user guide的过程中,发现实现protocol handler需要使用特殊的gen_s ...

  9. ios 即时通讯开源IM,LeanCloud、融云、环信

    环信官网链接: http://easemob.com/docs/ios/

  10. 一起学Python:多线程-共享全局变量

    多线程-共享全局变量 from threading import Thread import time g_num = 100 def work1(): global g_num for i in r ...