该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-01
最后修改:2011-01-01
http://www.iteye.com/topic/856574
1.之前的贴子地址:本也不想发了,实在气不过。 我再找一段代码如下: JTable: public boolean stopCellEditing() { String s = (String)super.getCellEditorValue(); // Here we are dealing with the case where a user // has deleted the string value in a cell, possibly // after a failed validation. Return null, so that // they have the option to replace the value with // null or use escape to restore the original. // For Strings, return "" for backward compatibility. if ("".equals(s)) { if (constructor.getDeclaringClass() == String.class) { value = s; } super.stopCellEditing(); } try { value = constructor.newInstance(new Object[]{s}); } catch (Exception e) { ((JComponent)getComponent()).setBorder(new LineBorder(Color.red)); return false; } return super.stopCellEditing(); } 再看看最初我写的代码: public static boolean validateInteger(String str) { try { Integer.parseInt(str); } catch (Exception ex) { return false; } return true; } 那此说validateInteger不能用的人,你难到真的看不出来,以上两段代码的原理是一样的。 我再说明一下:用异常做判断是可以的... 如果你理解了,很高兴能和你分享我的经验... 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-01
最后修改:2011-01-01
NumberUtils.isDigits("6E7");
我不认为找不到合试的API之前作的任何选择很可笑. { if (StringUtils.isEmpty(str)) { return false; } for (int i = 0; i < str.length(); i++) { if (!Character.isDigit(str.charAt(i))) { return false; } } return true; } 对于你前一个贴子说的那个问题 就是能不能用异常来作流程控制 答案是:不建议这么作..... 不建议!=禁止 禁止!=现实中没人这么作. 例子之一就是 重写equals时也要重写hash code |
|
返回顶楼 | |
发表时间:2011-01-01
抛出异常的爱 写道 NumberUtils.isDigits("6E7");
我不认为找不到合试的API之前作的任何选择很可笑. { if (StringUtils.isEmpty(str)) { return false; } for (int i = 0; i < str.length(); i++) { if (!Character.isDigit(str.charAt(i))) { return false; } } return true; } 对于你前一个贴子说的那个问题 就是能不能用异常来作流程控制 答案是:不建议这么作..... 不建议!=禁止 禁止!=现实中没人这么作. 例子之一就是 重写equals时也要重写hash code 我要说明的是,用异常做判断是可以的... 对于你前一个贴子说的那个问题 就是能不能用异常来作流程控制 你是指以下代码就是不对是吧? public static boolean validateInteger(String str) { try { Integer.parseInt(str); } catch (Exception ex) { return false; } return true; } |
|
返回顶楼 | |
发表时间:2011-01-01
gdpglc 写道 抛出异常的爱 写道 NumberUtils.isDigits("6E7");
我不认为找不到合试的API之前作的任何选择很可笑. { if (StringUtils.isEmpty(str)) { return false; } for (int i = 0; i < str.length(); i++) { if (!Character.isDigit(str.charAt(i))) { return false; } } return true; } 对于你前一个贴子说的那个问题 就是能不能用异常来作流程控制 答案是:不建议这么作..... 不建议!=禁止 禁止!=现实中没人这么作. 例子之一就是 重写equals时也要重写hash code 我要说明的是,用异常做判断是可以的... 对于你前一个贴子说的那个问题 就是能不能用异常来作流程控制 你是指以下代码就是不对是吧? public static boolean validateInteger(String str) { try { Integer.parseInt(str); } catch (Exception ex) { return false; } return true; } 我说了没找到合适的方法之前 什么方法都不可笑 一般用正则 二般自己写顺序比较 三般试着转一下看看抛不抛异常 都能达到目的. 不过不喜欢粗暴的方式完成这样的事 |
|
返回顶楼 | |
发表时间:2011-01-01
最后修改:2011-01-01
不好意思, 把 能不能 三字 看成不能了。 基本上我同意你说的。 我只是反对那些教条的人。
但注意: 你说的“不建议这么作...” 如果说因为有现成的可用,没必要自已写,而不建议我赞同。 如果说是因为用了异常做判断。呵呵,我还是那句话:用异常做判断是可以的。 |
|
返回顶楼 | |
发表时间:2011-01-01
同反对教条 , 只是例子说服力不够强而已.
|
|
返回顶楼 | |
发表时间:2011-01-01
楼主异常判断没问题的,我也这么用过。
而且仔细思考过,绝对没有什么副作用。 那些说不行的人可能是A型血的,或是星盘不好的导致性格有缺陷。 |
|
返回顶楼 | |
发表时间:2011-01-01
最后修改:2011-01-01
没遇到时候什么人都可以托付一生
遇到了除了那个人 你还考虑其它么? 异常是种跨方法跨类跨平台的指针...... 写代码就是作孽,作孽都是要还的.... |
|
返回顶楼 | |
发表时间:2011-01-01
最后修改:2011-01-01
遇到异常,处理手段,不外乎三种手段:
1.向上抛出封装异常。 2.内部处理。 3.忽略掉。 一般用策略1,代码示例,直接copy以前写的一个类方法: /** * 批量发送多条短信。将短信信息写到本地文件中,然后将该文件上传到短信平台的ftp服务器上。 * <pre> * 参考使用场景 * 给手机号码15801533150的手机号码发送信用卡已经消费100元人民币的短信。 * </pre> * * <ul> * <li>场景描述</li> * <p> * 一个用户使用信用卡刷卡消费后,系统会自动发送一个通知短信,告诉用户已经消费100元人民。 * * </p> * <li>使用示例</li> * <p> * <code> * * <pre> * * SMSPack pack = new SMSPack(); * pack.setBkid("711001"); * pack.setBtype("05140001"); * pack.setMobile("15801533150"); * pack.setSendMsg("您的卡号123已经消费100元人民币,中信银行。"); * J2EESMSUtil.sendSms(pack); * </pre></code> * </p> * <li>其他说明</li> * <p> * 无 * </p> * </ul> * * @param pack * 短信对象。 SMSPack短信对象 主要属性: * <ul> * <li>bkid:机构编码;</li> <li>btype:业务类型编码;</li> <li>mobile:目标手机号码; * </li> <li>mobileFlag:手机语言状态(历史遗留字段,值统一设定为大写英文字母C,表示手机语言是中文) * </li> <li> * sendType:内容类型文本,是业务类型的文本说明,不是必填字段,仅作为备注文本使用。(历史遗留字段,不需要填写 * ,该字段也不参加实际应用);</li> <li>sendMsg、短信内容;</li> <li> * plevel:发送优先级(必填)(4);</li> * </ul> * @return 是否发送成功,true-发送成功,false-发送失败。 */ public static boolean sendSms(List<SMSPack> packs) { // 标识短信是否发送成功。 boolean result = false; // 从配置文件中获得临时文件路径配置。 String tempPath = ConfigurationUtil.getUserConfigSingleValue( FtpUtil.MODULE_NAME, FtpUtil.GROUP_NAME, FtpUtil.TEMP_PATH_KEY); // 如果配置的临时文件路径为空,则抛出异常。 if (tempPath == null || tempPath.length() == 0) throw new MailException("32072001"); // 检查配置的临时文件路径是否存在,不存在则新创建。 File file = new File(tempPath); if (!file.exists()) file.mkdir(); // 判断该路径是否存在,是否是文件夹。 if (file != null && file.exists() && file.isDirectory()) { // 生成带时间戳的临时文件名,在本地的后缀名是".tag". String generatedTempFileName = generateTempFileName(); String tempFilePath = file.getAbsolutePath() + File.separator + generatedTempFileName; File tempFile = new File(tempFilePath); // 如果短信文件不存在,则创建一个新文件。 if (tempFile != null && !tempFile.exists()) try { tempFile.createNewFile(); } catch (IOException e1) { throw new MailException("32072002"); } // 将短信内容写入到本地的临时文件中。 File local = null; try { local = populateSmsFile(packs, tempFilePath); } catch (IOException e) { throw new MailException("32072002"); } try { // 使用user-config.xml中的ftp服务器配置连接服务器。 try { boolean connectedStatus = ftpUtil.connect(); // 如果连接失败,则抛出错误信息。 if (!connectedStatus) throw new MailException("32072004"); } catch (Exception e) { throw new MailException("32072004", e); } // 获得ftp远程服务器上的路径。 String remortFilePath = ConfigurationUtil .getUserConfigSingleValue(FtpUtil.MODULE_NAME, FtpUtil.GROUP_NAME, FtpUtil.REMOTE_PATH_KEY); int index = generatedTempFileName.lastIndexOf("."); if (!remortFilePath.endsWith("/")) remortFilePath = remortFilePath + "/"; // 将上传的短信临时文件名后缀从.tag改为.txt. remortFilePath = remortFilePath + generatedTempFileName.substring(0, index) + FtpUtil.REMOTE_TEXT_FILE_SUFFIX; result = ftpUtil .upload(local.getAbsolutePath(), remortFilePath); // 如果上传成功了,则看user-config.xml配置中是否要删除短信临时文件。 if (result) { // 默认是不删除临时文件。 boolean removeable = false; try { // 从配置文件中读取是否删除临时文件的配置项值。 removeable = Boolean.parseBoolean(ConfigurationUtil .getUserConfigSingleValue(FtpUtil.MODULE_NAME, FtpUtil.GROUP_NAME, FtpUtil.TEMP_FILE_REMOVABLE_KEY)); } catch (Exception e) { log .warn("can't get the value of removeable which default value is false"); } // 如果配置为删除短信临时文件,则删除它。 if (removeable) tempFile.delete(); } } catch (IOException e) { throw new MailException("32072003"); } } else { throw new MailException("32072001"); } return result; } 另外看系统异常架构了,有些人喜欢偷懒,图方便,(也就是说到此结束了,如果你跨类跨系统有没有成功,我不封装,也不抛出异常了,我在类里处理掉直接给用户ui提示错误信息了。) 其实我觉得楼主用异常判断结果是用了方案二。(重看了一下楼主的代码,用的策略三,自已吞掉异常) 用方法三的,当然也可以,什么都不管,那是个人问题了。哈哈。 其实我觉得这是系统异常处理策略的问题,说得不对,尽管批。 |
|
返回顶楼 | |
发表时间:2011-01-01
用异常判断正常逻辑不太好,一是程序结构不清晰,因为异常不仅仅代表了验证错误,还可能代表网络错误、内存溢出等问题;二是异常做判断,比用普通的判断方法耗费的系统资源要大得多,这个大得多的数量级在10倍以上。所以还是不要用异常处理正常逻辑,虽然功能用起来没问题,但不代表这种写法就是好的
|
|
返回顶楼 | |