每日一题:Java异常处理
什么是异常
在理想情况下,程序总会运行在很完美的环境中,网络不会终端,文件一定存在,程序不会有 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异常处理的更多相关文章
- Java实习生常规技术面试题每日十题Java基础(八)
目录 1.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法. 2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 3.运行时异常与受检异常有 ...
- Java实习生常规技术面试题每日十题Java基础(四)
目录 1.String 和StringBuffer的区别. 2.数组有没有length()这个方法? String有没有length()这个方法? 3.final, finally, finalize ...
- Java实习生常规技术面试题每日十题Java基础(七)
目录 1. Java设计模式有哪些? 2.GC是什么?为什么要有GC? 3. Java中是如何支持正则表达式. 4.比较一下Java和JavaSciprt. 5.Math.round(11.5) 等于 ...
- Java实习生常规技术面试题每日十题Java基础(六)
目录 1.在Java语言,怎么理解goto. 2.请描述一下Java 5有哪些新特性? 3.Java 6新特性有哪些. 4.Java 7 新特性有哪些. 5.Java 8 新特性有哪些. 6.描述Ja ...
- Java实习生常规技术面试题每日十题Java基础(五)
目录 1.启动一个线程是用run()还是start()? . 2.线程的基本状态以及状态之间的关系. 3.Set和List的区别,List和Map的区别? 4.同步方法.同步代码块区别? 5.描述Ja ...
- Java实习生常规技术面试题每日十题Java基础(三)
目录 1.是否可以从一个static方法内部发出对非static方法的调用? 2.Integer与int的区别? 3.Overload和Override的区别.参数列表相同,返回值不同的方法,是否是重 ...
- Java实习生常规技术面试题每日十题Java基础(二)
目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...
- Java实习生常规技术面试题每日十题Java基础(一)
目录 1.Java 的 "一次编写,处处运行"如何实现? 2.描述JVM运行原理. 3.为什么Java没有全局变量? 4.说明一下public static void main(S ...
- 【Java每日一题】20170106
20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
随机推荐
- 【C/C++学院】(23)Mysql数据库编程--C语言编程实现mysqlclient
[送给在路上的程序猿] 对于一个开发人员而言,能够胜任系统中随意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并能够利运用到系统中,由此简化系统的开发,是其架构生涯的第一步 ...
- Linux中mv重命名作用及打包war压缩文件及分配权限
1.Linux中的重命名文件使用mv命令 touch a.txt 新建一个文件 mv a.txt b.txt 重命名文件为b.txt mkdir abc 新建一个目录 mv abc abd 重命名文件 ...
- java十五个常用类学习及方法举例
<code class="language-java">import java.util.Scanner; import java.util.Properties; i ...
- Swift语言实现代理传值
需求:利用代理实现反响传值(下面样例採用点击第二个视图控制器中的button来改变第一个视图控制器中的Label的内容) 一.创建RootViewController import Foundatio ...
- 【81.37%】【codeforces 734B】Anton and Digits
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- mybatis在CRUD
一. 一个简短的引论: Mybatis本是apache的一个开源项目ibatis, 2010年这个项目由apache software foundation迁移到了google code, 而且改名为 ...
- Node.js学习疑惑整理
1.Node.js 在调用某个包时,会首先检查包中 package.json 文件的 main 字段,将其作为 包的接口模块,如果 package.json 或 main 字段不存在,会尝试寻找 in ...
- C++技术问题总结-第0篇 类型转换
从今天開始,对C++经常使用技术做个总结. 參考书籍:<C++Primer>.<C++对象模型>.<设计模式>.<Windows核心编程>.<ST ...
- Delphi2010,DelphiXE 安装控件找不到DesignIntf 解决办法
今天安装了一个可以支持IP 地址输入的edit控件,安装后可以放到窗体上,但是编译提示找不到DesignIntf,DesignEditors 从Delphi6开始,就对DesignIntf,Desig ...
- 如何提高自己的java开发功底
1.拥有扎实的基础和深刻理解OO原则 对于Java程序员,深刻理解Object Oriented Programming(面向对象编程)这一概念是必须的.没有OOPS的坚实基础,就领会不了像Java这 ...