实际工作中遇到的一个例子:
一、看这样一个方法:
/** 传入以微秒(us)为单位的时间字符串,转换成可读的(年-月-日 时:分:秒)日期格式*/
public String getDateStringByUSString(String usStr) { long time = Long.parseLong(usStr.substring(0, usStr.length() - 3)); Date dateInd = new Date(time); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(dateInd); }
1. 传入正常的字符串,一切都没问题。
e.g.
getDateStringByUSString("1533784565802862");
2018-08-09 11:16:05
2. 但是传入异常的字符串,各种抛出:
e.g.
getDateStringByUSString("11");
抛出:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1967)
at com.tuniu.cc.auto.call.util.DateUtil.getDateStringByUSString1(DateUtil.java:33)
at com.tuniu.cc.auto.call.util.DateUtil.main(DateUtil.java:53)
getDateStringByUSString("abcd")
抛出: Exception in thread "main" java.lang.NumberFormatException: For input string: "a" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Long.parseLong(Long.java:589) at java.lang.Long.parseLong(Long.java:631) at com.tuniu.cc.auto.call.util.DateUtil.getDateStringByUSString1(DateUtil.java:33) at com.tuniu.cc.auto.call.util.DateUtil.main(DateUtil.java:53)
如果抛出没有处理,那程序可就华丽丽的出BUG了。怎么防止这些抛出呢?
思路一:防止抛出
在调用这个方法时,对入参做判断:如果不符合条件,就不给调用该方法。这样在已考虑到的合法逻辑内不会有抛出。
思路二:处理抛出
随便输入参数,但是捕获抛出,实现软着陆。
添加抛出处理逻辑的代码如下:
public String getDateStringByUSString(String usStr) { try { long time = Long.parseLong(usStr.substring(0, usStr.length() - 3)); Date dateInd = new Date(time); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(dateInd); } catch (Exception e) { System.out.println(e.getMessage()); } return ""; }
多一点的思考:
这两种思路各有合适的使用场景和条件。以这个方法为例,个人觉得思路二更加的简洁易用。