try...catch...的小问题

public class Month_daycnt {
public static int calc_daycnt(int year,int month) {
int i;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
for (i=28;i<=31;i++){
try{
sdf.parse(year+"-"+month+"-"+i);
}
catch (Exception e){
break;

}
}
return i-1;
}
上面的程序,在给出年和月后,试图计算此年月有多少天。我的思路是,每一个年月要么是28,29,30,31,所以for(i=28;i<=31;i++)拼接年月日字符串去试图转换成日期,如果转换不了那么break循环;返回return i-1得到该年月日期。
问题是,似乎catch (Exception e)捕捉不到异常,所以break永远都没有执行。
为什么?

hearken01给出不错的回答 如果你坚持自己的算法 如下:
[code="java"]
public static int calc_daycnt(int year, int month) {
int i;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for (i = 28; i <= 31; i++) {
try {
Date d = sdf.parse(year + "-" + month + "-" + i);
if(month == d.getMonth()){
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return i - 1;
}
[/code]

建议先用正则作验证 然后验证失败的时候
[code="java"]
throw new Error("参数数据类型错误!");
[/code]
然后再用catch把它取得

根据JDK文档:
public Date parse(String text)
...
...
Throws:
ParseException - if the beginning of the specified string cannot be parsed.
所以你的情况下似乎总是可以parse的。(may not use all the text)

另外,try..catch的开销相对是比较大的,所以一般不要依靠抛出异常来实现正常功能。你试试用Calender.get(int field)来确实每个月的天数以及其实日期相关的东西吧。

建议使用Calendar类来实现,下面的方法是获取某年某月的最后一天:
[code="java"]
public int getLastDayOfMonth(int year, int month) {
int day = 0;
if (year < 1900 || year > 3000 || month < 1 || month > 12) {
return day;
}
try {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.add(Calendar.DAY_OF_MONTH, -1);
day = cal.get(Calendar.DAY_OF_MONTH);
} catch (Exception ex) {
ex.printStackTrace();
}
return day;
}
[/code]

这个不会抛出异常的 因为当day超出月份的最后一天时 会自动跑到下个月的第一天
如sdf.parse(1988 + "-" + 04+ "-" + 31)会获得1988年5月1日的日期对象