异常与断言

1、接口方法声明异常与实现类方法声明异常的关系
2、异常链——示例
3、try-catch-finally 推荐组织结构,及其缺陷
4、断言

-----------------------------------------------------------------------------------------------

1、接口方法声明异常与实现类方法声明异常的关系

接口方法声明异常,实现类的方法可以忽略异常声明;

接口方法没有声明异常,实现类的方法不能添加异常声明!

interface IRefactorTest{/*** 假设原方法为:public void test1();* 如果重构添加方法:public void test1() throws Exception;* 两个方法签名相同,无法通过编译器* * 如果重构,改变public void test1();* 为public void test1() throws Exception;* 那么以前实现的方法就没有抛出异常(如下:test1())*///public void test1();public void test1() throws Exception;public double getNum() throws Exception;
}public class InterfaceWithThrowRefactor implements IRefactorTest{/*** For this reason I prefer to define a superclass exception for a whole package * (such as SQLException for java.sql) and ensure that public methods only declare* this exception in their throws clause. That way I can define subclass exceptions * if I want to, but this won't affect a caller who knows only about the general case.*/@Overridepublic double getNum(){return 555.55;}/*** 如果接口的方法有声明异常,实现类的方法可以忽略该异常,如下* 如果接口的方法没有声明异常,则实现类的方法不能有声明的异常!*/@Overridepublic void test1(){System.out.println("Just test...");}public static void main(String[] args) {InterfaceWithThrowRefactor iwtr = new InterfaceWithThrowRefactor();iwtr.test1();try {double d = iwtr.getNum();System.out.println("d=" + d);} catch (Exception e) {e.printStackTrace();}}
}

2、异常链——示例

/*** Exception for subsystem*/
class SubsystemException extends Exception{private static final long serialVersionUID = -1395025218830523517L;public SubsystemException() {super();}public SubsystemException(String message) {super(message);}
}public class ExceptionThrowChain {public static void main(String[] args) {try {normalChain();} catch (SubsystemException e) {e.printStackTrace();}try {goodChain();} catch (SubsystemException e) {e.printStackTrace();}}private static void normalChain() throws SubsystemException{try {throwException();} catch (SQLException e) {throw new SubsystemException("database error: " + e.getMessage());}}private static void goodChain() throws SubsystemException{try {throwException();} catch (SQLException e) {SubsystemException sube = new SubsystemException("database error");sube.initCause(e);throw sube;}}//Method mock throw exceptionprivate static void throwException() throws SQLException{throw new SQLException("Can't connect to database!");}
}
normalChain( ) 方法不能跟踪——示例

goodChain( ) 方法能跟踪——示例

3、try-catch-finally 推荐组织结构,及其缺陷


实际代码示例:

	// Read a file as a single string:public static String read(String fileName) {StringBuilder sb = new StringBuilder();try {BufferedReader in = new BufferedReader( new FileReader(new File(fileName)) );try {String s;while ((s = in.readLine()) != null) {sb.append(s);sb.append("\n");}} finally {in.close();}} catch (IOException e) {throw new RuntimeException(e);}return sb.toString();}

分析:

a、如果 BufferedReader in = ...; 抛出异常(如,文件不存在),因为没有进入内部 try,因而不会执行内部 finally 的 in.close( ); 语句。

b、如果 BufferedReader in = ....; 成功构造,在内部 try 语句中抛出异常,则会执行内部 finally 对应的 in.close(); 语句。

c、将检查的异常 IOException 转换为运行时异常 RuntimeException,方法就不必声明抛出异常了,这种构造是可跟踪的。

缺陷当内部 try 和 finally 都抛出异常时,finally 的异常会覆盖 try 的异常,导致 try 内的异常丢失!


异常丢失示例(模拟):

public class TextFile{//Test exception in finally override other exceptionpublic static String read(InputStream in, int size) {StringBuilder sb = new StringBuilder();try {try {if( size==0 ){System.out.println("throw SubsystemException.");throw new SubsystemException("Exception that i want.");}} finally {in.close();}} catch (IOException e) {throw new RuntimeException(e);} catch (SubsystemException e) {throw new RuntimeException(e);}return sb.toString();}
} 
模拟:当传入参数 size 为 0 时,抛出SubSystemException!
public class TextFileTest {@Testpublic void testRead(){//NewInputStream easyIn = EasyMock.createMock(InputStream.class);//Call-recordtry {easyIn.close();EasyMock.expectLastCall().andThrow( new IOException("IOException of easy mock!"));} catch (IOException e) {}//ReplayEasyMock.replay( easyIn );TextFile.read(easyIn, 0);//VerifyEasyMock.verify(easyIn);}
}

模拟:模拟 InputStream 对象,使其调用 close( ) 方法时抛出 IOException!

注意:EasyMock 模拟的是而非接口,那么就必须都用模拟的 EasyMock 来调用 expectLastCall(), reaplay(), verify() 等方法!

运行,报错如下:

而且,有如下输出:

由上面两图,可得出结论:finally 内的 IOException 覆盖了内部 try 的 SubsystemException !

4、断言

公有的方法(即,API)用异常,非公有方法通常使用断言来检查参数。

When should you choose assertions? Keep these points in mind:
1、Assertion failures are intended to be fatal, unrecoverable errors. 
2、Assertion checks are turned on only during development and testing.

示例:

public class TestAssert {public void testAssert(){int[] a = new int[]{1, 22 , 3 ,5};//length is 3//offset is 2//a.length is 4//length > a.length - offset, Error!sort( a, 2, 3 );}private void sort( int a[], int offset, int length ){assert a != null;assert offset >= 0 && offset <= a.length;assert length >= 0 && length < a.length - offset;System.out.println("Just a test!");}
}
测试代码:

public class TestAssertTest {@Testpublic void testTestAssert() {TestAssert ta = new TestAssert();ta.testAssert();}
}
Eclipse启动运行时断言

测试结果,报错!




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019年《自然》迎新子刊:机器智能、新陈代谢和综述物理

来源&#xff1a;Nature自然科研微信公众号 概要&#xff1a;过去十年&#xff0c;人工智能和机器人学背后的技术已取得巨大飞跃&#xff0c;并带来各种精彩应用&#xff0c;如无人驾驶汽车、人工智能引导的医学诊断、智能数字家庭助手等。 《自然-机器智能》将发表和报道人工智…

hdfs 备份数配置_大数据||HDFS HA配置详解

根据HA架构图&#xff0c;规划HA的分布式集群服务器HA集群规划配置参考图根据官方文档配置HA部分说明Architecture在典型的ha集群中&#xff0c;两台独立的机器被配置为namenode。在任何时间点&#xff0c;一个namenodes处于活动状态&#xff0c;另一个处于备用状态。活动NameN…

如何保证添加自定义对象元素的唯一性

以图书管理系统为例 1、首先自定义一个图书类Book&#xff0c;自定义变量id&#xff0c;name&#xff0c;auther&#xff0c;price并重写getset()&#xff0c;toString()方法&#xff0c;此处具体代码省略。 2、再自定义一个管理图书类Manage&#xff0c;在管理类中先定义一个…

未来货运:无人驾驶技术和卡车司机如何配合?

来源&#xff1a;厚势 概要&#xff1a;看看你的周围。你看到的几乎所有东西都经过了卡车运输&#xff0c;无论是咖啡豆&#xff0c;还是你在使用的手机。 特斯拉刚刚发布了电动卡车&#xff0c;其实很多公司都对这一运输工具都在研究革新。Uber 本周&#xff08;17.11.18&…

bat脚本如何自动输入y_在Mac如何写一个相对自动的翻译脚本

近来使用的google翻译的插件有些不稳定&#xff0c; 时灵时不灵的&#xff0c;无奈的使用百度翻译了&#xff0c; 感觉体验也不好&#xff0c; 就想自己写一个翻译的脚本。整体思路简单&#xff0c; 就是调用百度翻译api再将结果呈现出来&#xff0c; 最后使用alias链接一下。大…

RefFieldMethodDetails——查看类的域和方法

RefFieldMethodDetails&#xff0c;通过反射机制查看类的域和方法&#xff08;包括编译器添加的“桥方法”&#xff09; public class RefFieldMethodDetails {/*** 打印出指定类的* 1、声明的所有构造方法&#xff08;包括私有&#xff09;* 2、声明的所有方法&#xff08;包括…

如何将对象中的内容按照一定的顺序进行排序

1、比较comparable和comparator&#xff0c;选择正确的方法进行排序 Comparable&#xff1a;强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序&#xff0c;类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次&#xff0c;不能经常修…

it 部门的建议_应对IT项目阻力的8个建议

点击上方“蓝色字体”&#xff0c;选择 “设为星标”关键讯息&#xff0c;D1时间送达&#xff01;大多数IT主管表示&#xff0c;有关抵触进行坦率的对话有助于产生新信息&#xff0c;从而最终推动项目向前发展。而且&#xff0c;在某些情况下&#xff0c;阻力是由于对需要进行路…

科学家首次在野外直接观察到雀类新物种的快速形成

来源&#xff1a;与峰同行博客 概要&#xff1a;新物种是怎么形成的&#xff1f;这是生物学上最根本的问题之一。大致听说过进化论的人可能都知道&#xff0c;地球上我们现在看到的各种各样的生物都是由最初的单细胞经过亿万年的进化而来的。 科学家首次在野外直接观察到雀类新…

java中的字符,字符串,数字之间的转换

java中的字符&#xff0c;字符串&#xff0c;数字之间的转换 string 和int之间的转换 string转换成int :Integer.valueOf(" “) int转换成string : String.valueOf(int i ) 或者Integer.toString(int i) 或者i” “//i为int类型 其中三者的效率为&#xff1a;Integer.toS…

查看某个分区之前所有的数据_腾讯大数据面试真题汇总

腾讯面试题学长11&#xff09;笔试部分&#xff08;1&#xff09;有一表名t_sh_mtt_netdisk_log&#xff0c;从表名可以看出该表是什么业务的&#xff0c;是什么周期粒度的表。&#xff08;2&#xff09;怎么查看表结构&#xff0c;表创建语句&#xff1f;怎么查看表有哪些分区…

全球16家超级独角兽公司,为什么中国能占7家,印度只有1家?未来哪些行业最可能诞生独角兽?

来源&#xff1a; 财看见-腾讯财经&#xff08;ID&#xff1a;qqckj2017&#xff09; 概要&#xff1a;对于创业公司来说&#xff0c;成为“独角兽”甚至是“超级独角兽”&#xff0c;就意味离成功只有几步之遥。 对于创业公司来说&#xff0c;成为“独角兽”甚至是“超级独角兽…

MySQL Cookbook 学习笔记-03

1、INNER JOIN关联查询 2、outer join&#xff08;LEFT JOIN 与 RIGHT JOIN&#xff09; 3、自连接 4、主从表查询 5、在分组内查找某列最大或最小的一行 6、计算小组积分榜 7、计算连续行的差 8、计算“累计和”与运行时平均值 9、使用 JOIN 控制查询结果的顺序 10、通过 UNIO…

数据可视化--pyecharts绘图

pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库。主要用于数据可视化。 要使用pyecharts绘制地图&#xff0c;首先需要安装一下几个地图模块&#xff1a; 1、安装地图数据包&#xff0c;用于显示地图 pip install echarts-countri…

echart x轴标签偏移_1文搞懂真正的五轴加工中心,到底说的5轴是哪几个轴

随着国内数控技术的日渐成熟&#xff0c;近年来五轴联动数控加工中心在各领域得到了越来越广泛的应用。在实际应用中&#xff0c;每当人们碰见异形复杂零件高效、高质量加工难题时&#xff0c;五轴联动技术无疑是解决这类问题的重要手段。越来越多的厂家倾向于寻找五轴设备来满…

中国在国际上首次提出全液态量子器件与计算技术概念

来源&#xff1a;人民日报 概要&#xff1a;液态金属可以用来制造计算机核心电子元件&#xff0c;进而引发计算机的革命&#xff1f; 液态金属可以用来制造计算机核心电子元件&#xff0c;进而引发计算机的革命&#xff1f;不久前&#xff0c;我国一个研究小组发表了一项成果&…

MySQL Cookbook 学习笔记-04

1、处理重复 <a>、创建表包含 primary key 或 unique index&#xff0c;阻止重复数据写入 <b>、联合 <a>&#xff0c;使用 INSERT IGNORE 或 REPLACE <c>、检查表是否有重复行的方法&#xff0c;通过 group by 和 count( x ) 来统计 <d>、通…

如何使用frame框架,将左边视为导航栏,右边作为链接界面

在浏览网页时&#xff0c;我们经常会看到一个导航条&#xff0c;当点击导航条上的项目时&#xff0c;相应网页会在显示区域变换显示。那么如何将一个界面中&#xff0c;左边设置为导航栏&#xff0c;点击项目链接&#xff0c;则右边显示相应的内容呢&#xff1f;使用frameset框…

面对大规模AI集成,企业为何迟迟犹豫?

来源&#xff1a;亿欧 概要&#xff1a;首先&#xff0c;需要全面了解您的业务目标、技术需求以及AI对客户和员工的影响。需要解决的问题是&#xff0c;大多数员工面临着接受人工智能程度方面的挑战与担忧。 人工智能是实现流程自动化、降低运营成本和进创新的重要手段。尽管AI…

类的初始化

加载 ----> 连接&#xff08;验证&#xff0c;准备&#xff0c;解析*&#xff09; ---->初始化 Java 虚拟机在首次主动使用类型时初始化它们。 主动使用&#xff08;6种&#xff09; 1、创建类的实例 2、调用类中声明的静态方法 3、操作类或者接口中声明的非常量静态…