作者tkcn (say)
看板java
标题Re: [问题] 程式的例外
时间Tue Apr 16 01:13:35 2013
我不太肯定自己的想法是不是正确的,所以若有错误请各位帮忙指正。
首先,在 Java 中 Exception 有两种,Check Exception 与 Uncheck Exception,
Check Exception 是那些必须使用 try-catch 包住或是宣告 throws 的 exceptions,
常见的有 IOException, InterruptedException, ... 等。
Uncheck Exception 则是相反,不需要 programmer 自行处理,程式也能够 compile,
常见的像是 IndexOutOfBoundsException, NullPointerException, ... 等。
而书上提到的例子,NumberFormatException 是属於 Uncheck Exception。
The Java Programming Language (Gosling, Arnold, and Holmes) 提到:
Unchecked runtime exceptions represent conditions that,
generally speaking, reflect errors in your program's logic
and **cannot be reasonably recovered** from at run time.
所以在你举的这个例子上,其实就如同你所说,不应该使用 exception handling,
而应该更主动的避免这样的情形发生。
但是,要如何正确的检查使用者输入的字串合不合法 (是否为 int) 呢?
即使使用者输入的全是数字,也会有 overflow 的可能,要正确判断并不是那麽容易。
在处理字串转数字的这个议题上,特别是在 5.0 之前,
老实说我觉得最适合的方法就是用 exception handling,
不过基本上我是把这视为特殊状况。
注 1: 在 C# 中有 tryParse() 可以回传 boolean 检查是否 parse 成功,
我觉得是个不错的方式,不过用到了 Java 所没有的 call by output。
注 2: Java 5.0 开始,Scanner.hasNextInt() 也算是解决了,
但也就 Scanner 能用。
Check Exception 正好相反,多半是那些你没有办法主动侦测、提前避免的状况,
举个例子,Server/Client 架构的程式,
在 Client 断线时,Server 会收到 SocketException。
Exception 是 "例外" 而不是 "错误",
在我看来 exception handling 比较像是一种流程控制。
---
void exp() {
if (...) {
throw new Exception();
}
}
void bar() {
while (...) {
exp();
}
}
void foo() {
try {
bar();
} catch (Exception e) {
// handle it
}
}
---
把上述程式改成没有 exception 的版本的版本:
---
int exp() {
if (...) {
return -1;
}
return 0;
}
int bar() {
while (...) {
int r = exp();
if (r==-1) return -1;
}
}
void foo() {
int r = bar();
if (r==-1) {
// handle it
}
}
---
这还只是比较简单的状况,如果进入的 function/method 更多层,
处理的 exception 更多时,就能够更加体现 Exception handling 的简洁。
※ 引述《Shrugg (泪眼问花花不语)》之铭言:
: 想请问一个一直都没办法在逻辑上说服自己的观念性问题
: 参考资料都说,程式的例外是用来撷取runtime时的例外情形,用来拦截例外的发生的.
: 可是要是已经知道会有那些例外可能发生,
: 设计程式时我们不是就会把限制条件给加上去了,
: 根本不用等到例外发生了再来拦截吧?
: Runtime会发生的例外都是设计程式时根本没想到的,既然没想到,
: 为什麽会知道要怎麽去预防呢?
: 像旗标的Java2第十四章以一个使用者输入错误当例子,程式例只能输入数字
: 但当使用者输入字串时就会是一个例外,所以程式安排这边设计一个拦截字串例外
: 发生时的处理.
: 但是假设我是这个程式的开发者
: 我要是一开始就知道这个例外的存在,我就会设条件让使用者不能输入数字以外的资料了
: 如果我连这个例外都没有预估到,我又怎麽会知道要去拦截这个例外呢?
: 希望有人知道我在说甚麽
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.34.7.189