论坛首页 Java企业应用论坛

验证String是不是整数,用异常作判断怎么了!(续2)

浏览 6913 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2011-01-01   最后修改:2011-01-01
1.之前的贴子地址:http://www.iteye.com/topic/856574

本也不想发了,实在气不过。

我再找一段代码如下:
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不能用的人,你难到真的看不出来,以上两段代码的原理是一样的。 

我再说明一下:用异常做判断是可以的...

如果你理解了,很高兴能和你分享我的经验...
   发表时间: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
0 请登录后投票
   发表时间: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; 
}


0 请登录后投票
   发表时间: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; 
}



我说了没找到合适的方法之前
什么方法都不可笑

一般用正则
二般自己写顺序比较
三般试着转一下看看抛不抛异常

都能达到目的.
不过不喜欢粗暴的方式完成这样的事
0 请登录后投票
   发表时间:2011-01-01   最后修改:2011-01-01
不好意思, 把 能不能 三字 看成不能了。 基本上我同意你说的。 我只是反对那些教条的人。

但注意:
你说的“不建议这么作...”

如果说因为有现成的可用,没必要自已写,而不建议我赞同。

如果说是因为用了异常做判断。呵呵,我还是那句话:用异常做判断是可以的。
0 请登录后投票
   发表时间:2011-01-01  
同反对教条 , 只是例子说服力不够强而已.
0 请登录后投票
   发表时间:2011-01-01  
楼主异常判断没问题的,我也这么用过。
而且仔细思考过,绝对没有什么副作用。

那些说不行的人可能是A型血的,或是星盘不好的导致性格有缺陷。
0 请登录后投票
   发表时间:2011-01-01   最后修改:2011-01-01
没遇到时候什么人都可以托付一生
遇到了除了那个人
你还考虑其它么?

异常是种跨方法跨类跨平台的指针......

写代码就是作孽,作孽都是要还的....

0 请登录后投票
   发表时间: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提示错误信息了。)
其实我觉得楼主用异常判断结果是用了方案二。(重看了一下楼主的代码,用的策略三,自已吞掉异常)
用方法三的,当然也可以,什么都不管,那是个人问题了。哈哈。
其实我觉得这是系统异常处理策略的问题,说得不对,尽管批。
0 请登录后投票
   发表时间:2011-01-01  
用异常判断正常逻辑不太好,一是程序结构不清晰,因为异常不仅仅代表了验证错误,还可能代表网络错误、内存溢出等问题;二是异常做判断,比用普通的判断方法耗费的系统资源要大得多,这个大得多的数量级在10倍以上。所以还是不要用异常处理正常逻辑,虽然功能用起来没问题,但不代表这种写法就是好的
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics