没有合适的资源?快使用搜索试试~ 我知道了~
36丨 实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象?1
需积分: 0 0 下载量 7 浏览量
2022-08-04
00:40:58
上传
评论
收藏 1.96MB PDF 举报
温馨提示
试读
18页
在正常情况下,函数返回数据的类型非常明确,但是,在异常情况下,函数返回的数据类型却非常灵活,有多种选择。除了刚刚提到的类似 UnknownHostExcepti
资源详情
资源评论
资源推荐
36 | 实战二(上):程序出错该返回啥?NULL、异常、错误码、空
对象?
2020-01-24 王争
设计模式之美
进入课程
讲述:冯永吉
时长 15:44 大小 14.42M
我们可以把函数的运行结果分为两类。一类是预期的结果,也就是函数在正常情况下输出的
结果。一类是非预期的结果,也就是函数在异常(或叫出错)情况下输出的结果。比如,在
上一节课中,获取本机名的函数,在正常情况下,函数返回字符串格式的本机名;在异常情
况下,获取本机名失败,函数返回 UnknownHostException 异常对象。
在正常情况下,函数返回数据的类型非常明确,但是,在异常情况下,函数返回的数据类型
却非常灵活,有多种选择。除了刚刚提到的类似 UnknownHostException 这样的异常对
象之外,函数在异常情况下还可以返回错误码、NULL 值、特殊值(比如 -1)、空对象
(比如空字符串、空集合)等。
下载APP
每一种异常返回数据类型,都有各自的特点和适用场景。但有的时候,在异常情况下,函数
到底该返回什么样的数据类型,并不那么容易判断。比如,上节课中,在本机名获取失败的
时候,ID 生成器的 generate() 函数应该返回什么呢?是异常?空字符?还是 NULL 值?
又或者是其他特殊值(比如 null-15293834874-fd3A9KBn,null 表示本机名未获取到)
呢?
函数是代码的一个非常重要的编写单元,而函数的异常处理,又是我们在编写函数的时候,
时刻都要考虑的。所以,今天我们就聊一聊,如何设计函数在异常情况下的返回数据类型。
话不多说,让我们正式开始今天的学习吧!
从上节课的 ID 生成器代码讲起
上两节课中,我们把一份非常简单的 ID 生成器的代码,从“能用”重构成了“好用”。最
终给出的代码看似已经很完美了,但是如果我们再用心推敲一下,代码中关于出错处理的方
式,还有进一步优化的空间,值得我们拿出来再讨论一下。
为了方便你查看,我将上节课的代码拷贝到了这里。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class RandomIdGenerator implements IdGenerator {
private static final Logger logger = LoggerFactory.getLogger(RandomIdGenerato
@Override
public String generate() {
String substrOfHostName = getLastFiledOfHostName();
long currentTimeMillis = System.currentTimeMillis();
String randomString = generateRandomAlphameric(8);
String id = String.format("%s-%d-%s",
substrOfHostName, currentTimeMillis, randomString);
return id;
}
private String getLastFiledOfHostName() {
String substrOfHostName = null;
try {
String hostName = InetAddress.getLocalHost().getHostName();
substrOfHostName = getLastSubstrSplittedByDot(hostName);
} catch (UnknownHostException e) {
logger.warn("Failed to get the host name.", e);
}
return substrOfHostName;
这段代码中有四个函数。针对这四个函数的出错处理方式,我总结出下面这样几个问题。
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
}
@VisibleForTesting
protected String getLastSubstrSplittedByDot(String hostName) {
String[] tokens = hostName.split("\\.");
String substrOfHostName = tokens[tokens.length - 1];
return substrOfHostName;
}
@VisibleForTesting
protected String generateRandomAlphameric(int length) {
char[] randomChars = new char[length];
int count = 0;
Random random = new Random();
while (count < length) {
int maxAscii = 'z';
int randomAscii = random.nextInt(maxAscii);
boolean isDigit= randomAscii >= '0' && randomAscii <= '9';
boolean isUppercase= randomAscii >= 'A' && randomAscii <= 'Z';
boolean isLowercase= randomAscii >= 'a' && randomAscii <= 'z';
if (isDigit|| isUppercase || isLowercase) {
randomChars[count] = (char) (randomAscii);
++count;
}
}
return new String(randomChars);
}
}
对于 generate() 函数,如果本机名获取失败,函数返回什么?这样的返回值是否合理?
对于 getLastFiledOfHostName() 函数,是否应该将 UnknownHostException 异常在
函数内部吞掉(try-catch 并打印日志)?还是应该将异常继续往上抛出?如果往上抛出
的话,是直接把 UnknownHostException 异常原封不动地抛出,还是封装成新的异常
抛出?
对于 getLastSubstrSplittedByDot(String hostName) 函数,如果 hostName 为
NULL 或者是空字符串,这个函数应该返回什么?
对于 generateRandomAlphameric(int length) 函数,如果 length 小于 0 或者等于
0,这个函数应该返回什么?
剩余17页未读,继续阅读
宝贝的麻麻
- 粉丝: 32
- 资源: 294
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python爬取淘宝热卖商品并可视化分析
- 5152单片机proteus仿真和源码将按键次数写入AT24C02再读出并用1602LCD显示
- SE-SSD复现过程(Det3D的安装教程)
- 基于Python的在线学习与推荐系统设计与实现(论文+源码)-kaic
- 串口通过 YMODEM 协议进行文件传输
- 蓝桥杯2024年第十五届省赛真题-前缀总分
- com.qihoo.appstore_300101305-1.apk
- tensorflow-gpu-2.7.1-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-2.7.2-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-2.7.1-cp39-cp39-manylinux2010-x86-64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0