java 板


LINE

※ 引述《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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP