详解Java中Checked Exception与Runtime Exception 的区别

Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况。而在学Java 的时候,我们也只知道Exception 的写法,却未必真能了解不同种类的Exception 的区别。
首先,您应该知道的是Java 提供了两种Exception 的模式,一种是执行的时候所产生的Exception (Runtime Exception),另外一种则是受控制的Exception (Checked Exception)。
所有的Checked Exception 均从java.lang.Exception 继承而来,而Runtime Exception 则继承java.lang.RuntimeException 或java.lang.Error (实际上java.lang.RuntimeException 的上一层也是java.lang.Exception)。
当我们撰写程序的时候,我们很可能会对选择某种形式的Exception 感到困扰,到底我应该选择Runtime Exception 还是Checked Exception ?
其实,在运作上,我们可以通过Class 的Method 如何产生某个Exception以及某个程序如何处理这个被产生来的Exception 来了解它们之间的差异。
首先我们先建立一个Exception
public class CException extends Exception
{
public CException() {}
public CException(String message)
{
super(message);
}
}
然后我们撰写一个可能产生 CException 的 Class
public class testException
{
public void method1() throws CException
{
throw new CException("Test Exception");
}
public void method2(String msg)
{
if(msg == null)
{
throw new NullPointerException("Message is null");
}
}
public void method3() throws CException
{
method1();
}
// 以下省略
// ...
}
在这三个method 中,我们看到了method1 和method2 的程序码内都会产生Exception,但method3 的程序码中(大括号内),并没产生Exception,但在method3 的定义中,暗示了这个method 可能产生CException。
呼叫method1() 的程序,必须将method1() 包含在try 与catch 中,如:
public class runtest
{
// ....
public static void main(String argv[])
{
testException te = new testException();
try
{
te.method1();
}
catch(CException ce)
{
// ....
}
}
// ...
}
虽然包含在try 与catch 中,并不表示这段程序码一定会收到CException,但它的用意在于提醒呼叫者,执行这个method 可能产生的意外,而使用者也必须要能针对这个意外做出相对应的处理方式。
当使用者呼叫method2() 时,并不需要使用try 和catch 将程序码包起来,因为method2 的定义中,并没有throws 任何的Exception ,如:
public class runtest
{
// ....
public static void main(String argv[])
{
testException te = new testException();
// 不会产生 Exception
te.method2("Hello");
// 会产生 Exception
te.method2(null);
}
// ...
}
程序在执行的时候,也不见得会真的产生NullPointerException ,这种Exception 叫做runtime exception 也有人称为unchecked exception ,产生Runtime Exception 的method (在这个范例中是method2) 并不需要在宣告method 的时候定义它将会产生哪一种Exception
在testException 的method3() 中,我们看到了另外一种状况,也就是method3里呼叫了method1() ,但却没有将method1 包在try 和catch 之间。相反,在method3() 的定义中,它定义了CException,实际上就是如果method3 收到了CException ,它将不处理这个CException ,而将它往外丢。当然,由于method3 的定义中有throws CException ,因此呼叫method3 的程序码也需要有try catch 才行。
因此从程序的运作机制上看,Runtime Exception与Checked Exception 不一样,然而从逻辑上看,Runtime Exception 与Checked Exception 在使用的目的上也不一样。
一般而言,Checked Exception 表示这个Exception 必须要被处理,也就是说程序设计者应该已经知道可能会收到某个Exception(因为要try catch住) ,所以程序设计者应该能针对这些不同的Checked Exception 做出不同的处理。
而Runtime Exception 通常会暗示着程序上的错误,这种错误会导致程序设计者无法处理,而造成程序无法继续执行下去。
看看下面的例子:
String message[] = {"message1", "message2","message3"};
System.out.println(message[3]);
这段程序码在Compile 时并没问题,但在执行时则会出现ArrayIndexOutOfBoundException 的例外,在这种状况下,我们亦无法针对这个Runtime Exception 做出有意义的动作,这就像是我们呼叫了testException 中的method2 ,却引发了它的NullPointerException 一样,在这种状况下,我们必须对程序码进行修改,从而避免这个问题。
因此,实际上我们应该也必须要去抓取所有的Checked Exception,同时最好能在这些Checked Exception 发生的时候做出相对应的处理,好让程序能面对不同的状况。
然而对于Runtime Exception ,有些人建议将它catch 住,然后导向其它地方,让程序继续执行下去,这种作法并非不好,但它会让我们在某些测试工具下认为我们的程序码没有问题,因为我们将Runtime Exception "处理"掉了,事实却不然!譬如很多人的习惯是在程序的进入点后用个大大的try catch 包起来,如:
public class runtest1
{
public static void main(String argv[])
{
try
{
//...
}
catch(Exception e)
{
}
}
}
在这种情况下,我们很可能会不知道发生了什么Exception 或是从哪一行发出的,因此在面对不同的Checked Exception时,我们可已分别去try catch它。而在测试阶段时,如果碰到Runtime Exception ,我们可以让它就这样发生,接着再去修改我们的程序码,让它避免Runtime Exception,否则,我们就应该仔细追究每一个Exception ,直到我们可以确定它不会有Runtime Exception 为止!
对于Checked Exception 与Runtime Exception ,我想应该有不少人会有不同的观点,无论如何,程序先要能执行,这些Exception 才有机会产生。因此,我们可以把这些Exception 当成是Bug ,也可以当成是不同的状况(Checked Exception),或当成是帮助我们除错的工具(Runtime Exception),但前提是我们需要处理这些Exception ,如果不处理,那么问题或状况就会永远留在那里。
以上就是Java中Checked Exception与Runtime Exception 的区别,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Checked
# Exception与Runtime
# Exception的区别
# java中Checked
# Exception
# 的对比
# Java常用类库StringBuffer
# Runtime
# 日期操作类等类库总结
# Java Runtime用法实战案例
# Java编程使用Runtime和Process类运行外部程序的方法
# Java异常处理运行时异常(RuntimeException)详解及实例
# java.lang.Runtime.exec() Payload知识点详解
# 我们可以
# 会有
# 但在
# 这段
# 在这种
# 很可能
# 上看
# 将它
# 相对应
# 的是
# 也就是说
# 看到了
# 我想
# 就会
# 也不
# 是在
# 有个
# 在这个
# 必须要
# 将会
相关文章:
如何通过商城免费建站系统源码自定义网站主题?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
公司网站制作价格怎么算,公司办个官网需要多少钱?
建站主机选虚拟主机还是云服务器更好?
电商平台网站制作流程,电商网站如何制作?
专业公司网站制作公司,用什么语言做企业网站比较好?
开源网站制作软件,开源网站什么意思?
如何确认建站备案号应放置的具体位置?
建站之星后台密码遗忘?如何快速找回?
如何在自有机房高效搭建专业网站?
网页设计网站制作软件,microsoft office哪个可以创建网页?
如何选择CMS系统实现快速建站与SEO优化?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
网站制作免费,什么网站能看正片电影?
如何在云主机上快速搭建网站?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Java解压缩zip - 解压缩多个文件或文件夹实例
建站OpenVZ教程与优化策略:配置指南与性能提升
如何选择网络建站服务器?高效建站必看指南
如何在IIS中配置站点IP、端口及主机头?
如何选择靠谱的建站公司加盟品牌?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
开封网站制作公司,网络用语开封是什么意思?
表情包在线制作网站免费,表情包怎么弄?
如何用免费手机建站系统零基础打造专业网站?
linux top下的 minerd 木马清除方法
如何获取免费开源的自助建站系统源码?
如何选择高效响应式自助建站源码系统?
如何通过虚拟主机空间快速建站?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
Python lxml的etree和ElementTree有什么区别
建站之星安装后如何自定义网站颜色与字体?
平台云上自助建站如何快速打造专业网站?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
建站之星安装步骤有哪些常见问题?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
如何快速完成中国万网建站详细流程?
建站主机选哪家性价比最高?
如何登录建站主机?访问步骤全解析
视频网站app制作软件,有什么好的视频聊天网站或者软件?
韩国服务器如何优化跨境访问实现高效连接?
建站之星如何修改网站生成路径?
如何高效配置香港服务器实现快速建站?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
建站上传速度慢?如何优化加速网站加载效率?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何在新浪SAE免费搭建个人博客?
宝塔面板如何快速创建新站点?
已有域名如何快速搭建专属网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。