作者PsMonkey (痞子军团团长)
看板java
标题Re: [问题] 想问一些例外的观念..
时间Thu Nov 10 13:55:41 2011
※ 引述《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
1F:推 aleelyle:版主真好心 11/10 14:03
2F:推 LaPass:简单易懂 11/10 14:05
3F:推 s66449:版主好佛心> < 11/10 15:09
4F:推 james732:这篇好棒! 11/10 15:15
5F:推 jacky951:解了我多年的exception的问题! 要开始努力用了! 11/10 16:12
6F:→ adrianshum:throw...SuckPsMonkey...又吸PsMonkey又丢的... 好色 11/10 17:21
7F:→ PsMonkey:噗... 楼上救援成功 XD 11/10 17:38
8F:推 mrker:这篇赞喔! 譬喻的很洽当 11/10 22:29
9F:→ PsMonkey:你是指「PsMonkey 是混帐东西」吧? XD 11/11 00:45
10F:推 gs1458:推adrianshum救援成功XDDDD+ 11/11 09:15
11F:→ pzyc79:刚学Java的时後就觉得Exception真是好 跟VB6的错误对话框比 11/11 22:12
12F:推 autumned:不吸就不丢 吸了就会丢 11/12 10:20
13F:推 macdivas: @@ 四年後再看一遍 感觉不太一样 2015/ 11/26 18:06