参考文章:李秋豪翻译的mit软件构造阅读材料, 以及原文
exception instead of return -1
由于在之前一直用的都是C语言, 所以刚开始使用java时我保留了一个非常不好的习惯, 也因为这个问题带来了很多麻烦, 不过直到看到这篇文章我才知道我究竟是哪儿错了.
举个例子: C语言中比如我需要一个程序实现这样一个功能: 在一个字符串中找到某个特定的字符, 并返回其第一次出现的位置, 我可能就会用如下这么实现了
int find_chr_in_str(char *str, char ch){
int str_len = strlen(str);
for(int i=0; i
注意到在这儿我考虑到了str
中可能不会出现ch
的情况, 于是我对这种情况就将返回值设为-1
. c语言常用的方式, 于是我刚开始写java的时候也都这么写. 不管什么函数都把返回类型设为int
, 如果发生错误就返回-1
, 没有错误就返回0
. 这样做的会带来两种麻烦:
- 可能有些函数的返回值就需要-1, 这种时候我又该使用什么返回值来告诉用户出现了异常情况呢? 而且不管我用什么其它的数字来表示异常都会导致实现的不一致.
- 既然存在实现不一致了, 那么多函数我不可能都记得返回值得含义, 于是经常调用一个函数的时候得看看这个函数发生异常时会返回什么, 非常不直观.
知道我看了这篇文章(之后再具体分析), 才发现了优雅的解决方法:使用java提供的异常处理机制, 在java中我们可以这么实现这个函数:
int findCharInStr(String str, char ch) throws NotFoundException{
int strLen = str.size();
for(int i=0; i
这样实现后, 如果我们之后再在别的地方调用这个函数java就会要求我们必须处理这个函数返回的Exception
, catch
这个Exception
或者继续向上传递.
使用这种方式我们既不用担心异常处理的返回值可能和函数本身返回值发生冲突也不用担心调用的时候忘记处理异常.
2. checked_and_unchecked_expection_in_java
java中的Exception
分两种, checked
和 unchecked
:
-
checked Exception
就是要求产生的函数必须使用throws
声明, 调用的函数也必须处理的Exception
, 比如上面使用的NotFoundException
. -
unchecked Exception
就是产生不需要使用throws
声明, 调用函数也可以不处理的Exception
, 比如RuntimeException
.
我们通产使用checked Exception
来处理需要返回特殊的返回值得情况: 比如上面的: 字符串中找不到想要的函数, 或者返回对象为null
的时候. 而unchecked Exception
则用来快速暴露错误: 比如文件打不开了, 除零错误等等.