JAVA的异常与契约思想
异常分为编译时异常,运行时异常
- throwable
- error
- exception
- RuntimeException
- Exception
java把异常封装成类的形式展示,如果出现了异常java会根据问题所描述的异常类,创建一个对象实例,然后抛出给上一级,
异常抛出到jvm虚拟机后将异常出现的位置和和错误的原因打印在控制台
- throw想异常对象抛出给调用者
- throws仅仅对方法进行声明,告知调用者方法存在异常
spring框架的事务默认是RuntimeException才进行回滚
何时抛出受检异常,何时抛出运行时异常
严格的表述:
运行时异常: 代表bug、不可抗力因素,总得有人来背锅,例如除零异常,空指针,或者网络波动类的异常就需要网络管理员来解决
受检的异常: 代表一种业务场景,比如抛出IOException,来代表此文件可能存在肯不存在
/*
* date格式化的方式有很多中,格式化的字符格式也不是约定俗成的
* 是制作这个类的人规定的,没有按照规范格式化有可能是格式化的一种
* 所以应该向上抛出一个受检的异常来满足契约
* */
Date parse = new SimpleDateFormat().parse("");
简单的表述:
只需满足业务场景即可,两种异常任选一种抛出,不再过于强调抛出受检异常来代表一种业务场景的可能性
/*
* 输入的字符串不能被解析也算是业务逻辑的一种
* 但是因为此方法的功能是将字符串转换为数字
* 传输的字符串是数字,这是一种约定俗称的规则
* 所以如果传输的不是字符串就不再抛出受检的异常
* */
int i = Integer.parseInt("adfaf");
契约思想
接口契约
--为了沟通协作,需要在调用接口是规定的非常明确,大家都遵守这个规则
-
前置条件: 一般是指对参数的要求(规定好调用此接口,掺入的参数需要满足什么条件)
-
后置条件: 调用接口后返回达成的状态,(例如此接口承诺实现插入操作,运行结束后一定要实现此操作,如果不能实现,就需要返回信息代表未实现)
—实现接口契约,就需要使用返回的参数和抛出的异常还有注解来说明此接口的作用,还有可能发生的业务场景.如果此接口的调用方没有按照规定传参,就可以直接抛出RuntimeException来表示调用方的错误
—如果接口调用者在运行接口过程中发送了RuntimeExcepion的子异常,也就是JDK抛出的异常就说明是接口的制作者的错误
以此方法来方便规定责任.尽量做到只要满足我接口的入参条件,我就返回调用方需要的数据或者抛出一个我已经声明好的业务异常.这才是个好的接口作者.
为什么是抛出异常而不是使用boolean或者int类型作为返回值的状态码?
首先,boolean类型只能涵盖两种状态,不能真实的表达出是因为何种原因导致了程序出现异常,而且不能即返回boolean又返回参数.
其次,在c语言的时代会使用int类型作为返回值代表状态,首先因为因为在c语言中可以使用数值类型进行判断,其次现在java也提供多样性——异常的方式来具体描述出接口的功能与业务逻辑
http状态码,也是符合契约思想的
- 2xx: 代表程序顺利运行
- 3xx: 代表抛出声明的异常
- 4xx: 代表调用方的错误
- 5xx: 代表接口作者的错误
最近得到的一些浅显的见解,欢迎大家随时指正!