java 板


LINE

我不太肯定自己的想法是不是正确的,所以若有错误请各位帮忙指正。 首先,在 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







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灯, 水草

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

TOP