Re: [問題] 想問一些例外的觀念..
※ 引述《s66449 (老實樣)》之銘言:
: 小弟不才...經驗不多 對例外的觀念還不是很懂
: 想要發問討教一下
: 1.throw這個關鍵字是在敘述中 自行拋出例行
: 什麼情況下 需要自行拋出例外呢??
: 而且就算不自行拋出 系統也是會自動拋出例外啊
^^^^^^^^^^^^^^^^^^^^^^^^
: 為什麼還會有這個關鍵字想要讓我們自行拋出呢??
其實這有點自問自答了
所謂「自動」,那也是程式在做的事情啊 XD
當然你要想成 exception 都是 JVM 才能炸,那也是可以
只不過設計這個機制,讓所有 class(包含 core java)能炸 exception
不是很美妙嗎?
好吧,還是舉個例子
你希望寫個「我討厭 PsMonkey 的登入系統」
你當然可以這樣寫
boolean valid(User user){
if("PsMonkey".equals(user.getName()){
return false;
}
//other valid code,例如檢查密碼
}
這樣很麻煩,因為當呼叫 valid() 的 caller 拿到 false 時
他會不知道到底是帳號密碼對不起來,還是單純 PsMonkey 登入
當然,你可以把 boolean 改成 status code,像 HTTP 那樣
如果 PsMonkey 登入回傳 -1,正常回傳 1,帳號密碼錯誤回傳 0
這樣也會符合需求
可是,PsMonkey 到底算是什麼混帳東西(自婊應該不算人身攻擊 XD)
值得我特地賞他一個座墊... 我是說 status code
我不但要把明明很單純回傳 boolean 值的 valid 改成 int
而且 caller 還要寫一堆 switch 去判斷對應
再說如果要程式碼好看好讀一點,我還得寫成這樣
public static final int SUCK_PSMONKEY_LOGIN = -1;
public static final int OK_LOGIN = 1;
public static final int FAIL_LOGIN = 0;
int valid(User user){
if("PsMonkey".equals(user.getName()){
return SUCK_PSMONKEY_LOGIN;
}
//other valid code,例如檢查密碼
}
void caller(){
//......
switch(valid(user)){
case SUCK_PSMONKEY_LOGIN:
//......
case OK_LOGIN:
//......
case FAIL_LOGIN:
//......
}
問題是,這是意外! 是意外!
我壓根不想要 PsMonkey 登入!
那麼,這樣寫不就好看/符合語意多了?
boolean valid(User user) throws Exception{
if("PsMonkey".equals(user.getName()){
throw new SuckPsMonkeyLoginException();
}
//other valid code,例如檢查密碼
}
當然,你要說這樣 caller 還是要寫 try-catch
跟 switch 也沒啥差別
問題是...
1. 你的 caller 沒有用對應的 try-catch
(還要對的 exception class,雖然我常常寫 catch(Exception e)... )
compiler 會不讓你過關
但是 status code 的方法,你沒有處理(對應)的 code 你也不會知道
2. 因為 Exception 是個 class
你要在裡頭包山包海包二奶 [喂喂] 都可以
可以透過物件來傳資訊、甚至作一些處理
或許扯的有點遠了
不過,我一開始就說了,這是個有點問題就是答案的問題
或許你應該從一些 source code 去思考整個 exception 機制
而不是單看 throw 這個 keyword
: 2.還有一個由method拋出的關鍵字是throws
: 主要用法是不想要在method內 直接處理例外
: 而是透過method拋出 去由呼叫該method的method
: 內的try catch解決 是這樣嗎??
「啊這又不是我的責任,我不管!」
又不是只有政府官員才能推卸責任 [喂喂]
OO 裡頭一個基本的原則就是「單一責任制」 [無誤]
: 3.Scanner的next()和BufferedReader的nextLine()
: 兩者都是讓使用者輸入文字的
: 為什麼前者不需要強迫處理例外 而後者需要強迫處理IO例外呢??
: 我有去看API的文件 的確後者的方法有拋出例外
: 所以才要強迫處理例外
: 這就是我問題的答案嗎??還是有別的呢??
: 麻煩幫忙指點一下..謝謝> <
這太難了,我不會 XD
====
最近寫這種沒啥營養的東西特別流暢 Orz
--
錢鍾書: 說出來的話
http://www.psmonkey.org
比不上不說出來的話
Java 版 cookcomic 版
只影射著說不出來的話
and more......
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.1.209
推
11/10 14:03, , 1F
11/10 14:03, 1F
推
11/10 14:05, , 2F
11/10 14:05, 2F
推
11/10 15:09, , 3F
11/10 15:09, 3F
推
11/10 15:15, , 4F
11/10 15:15, 4F
推
11/10 16:12, , 5F
11/10 16:12, 5F
→
11/10 17:21, , 6F
11/10 17:21, 6F
→
11/10 17:38, , 7F
11/10 17:38, 7F
推
11/10 22:29, , 8F
11/10 22:29, 8F
→
11/11 00:45, , 9F
11/11 00:45, 9F
推
11/11 09:15, , 10F
11/11 09:15, 10F
→
11/11 22:12, , 11F
11/11 22:12, 11F
推
11/12 10:20, , 12F
11/12 10:20, 12F
推
11/26 18:06, , 13F
11/26 18:06, 13F
討論串 (同標題文章)