闰年的检查和数字转化错误的处理
要求
在输入框中输入年份,点击确定以后显示该年是否是闰年。
分析
程序编写中要注意的问题有以下几点
- 年份一定是在公元后,所以输入年份不小于0.
- 输入内容的规范性。规范的输入要求要以数字或者负号打头,其余是数字字符串,并且数字的范围会受到计算机的表示范围限制。其余输入会被提示输入不规范。所以要考虑两个方面,一是输入的范围具体数据类型表示范围,因为实际用到的年份很难超出[0, 2147483647]这个范围,所以用int 类型表示输入的年份是合适的。二是输入的字符中出现字母的时候,要么直接提示输入错误,要么尽量的将输入字符转化成数字。在具体的实现上,可以利用try-catch机制捕捉错误,然后处理错误,或者是提前处理数据,保证数据规范。
具体实现
使用try-catch捕捉错误的实现方法
这种做法直接将输入字符串转换,如果转换成功则程序继续执行,继续判断该年是否是闰年;如果转换失败,则抛出错误,错误被处理之后程序继续执行。需要注意的是,转换出错的情况在只是越界,字符串为空和字符串含非数字三种情况,但是输入负数的时候是转换正确的,这里需要我们将数字改成正数。
1 public void handle(ActionEvent ae) { 2 3 int year = 0; 4 try { 5 year = Integer.parseInt(textField.getText()); 6 if(year < 0){ 7 year *= -1; 8 JOptionPane.showMessageDialog(null, 9 "应该输入正数,现在按正数算", null, 10 JOptionPane.WARNING_MESSAGE); 11 12 } 13 14 } catch (Exception e) { 15 JOptionPane.showMessageDialog(null, 16 "请用数字输入年份 范围是[0, 2147483647]", null, 17 JOptionPane.ERROR_MESSAGE); 18 return; 19 } 20 21 if(isLeapYear(year)){ 22 JOptionPane.showMessageDialog(null, 23 year + " 年是闰年", null, 24 JOptionPane.INFORMATION_MESSAGE); 25 26 }else{ 27 JOptionPane.showMessageDialog(null, 28 year + " 年是平年", null, 29 JOptionPane.WARNING_MESSAGE); 30 } 31 } 32 33 34 使用try-catch捕捉错误的实现方法
提前处理数据的处理方法
提前处理数据,使得Integer.parseInt()接受的字符串符合要求,这样也能避免错误的产生。对于需要用户输入的程序来说,更好的办法是在输入的时候就对输入进行检查,这样比等用户输入玩之后在检查更加友好。或者是当用户提交输入以后,尽量处理数据。下面的代码中就是使用尽量处理数据的做法。
1 public void handle(ActionEvent ae) { 2 String input = textField.getText(); 3 if (input == null || input.equals("")) { 4 return; 5 } 6 int year = 0; 7 8 if (input.matches("[0-9]{1,9}")) { 9 year = Integer.parseInt(input); 10 }else{ 11 char[] chs = input.toCharArray(); 12 int i; 13 for(i = 0; i < chs.length && year < (Integer.MAX_VALUE/10);i++){ 14 if(Character.isDigit(chs[i])){ 15 year = (year*10 + Integer.parseInt("" + chs[i])); 16 } 17 } 18 if(year == (Integer.MAX_VALUE/10) && i < chs.length){ 19 while(i < chs.length){ 20 if(Character.isDigit(chs[i]) && Integer.parseInt("" + chs[i]) <= 7){ 21 year = (year*10 + Integer.parseInt("" + chs[i])); 22 break; 23 } 24 i++; 25 } 26 } 27 } 28 if (isLeapYear(year)) { 29 JOptionPane.showMessageDialog(null, year + " 年是闰年", null, 30 JOptionPane.INFORMATION_MESSAGE); 31 32 } else { 33 JOptionPane.showMessageDialog(null, year + " 年是平年", null, 34 JOptionPane.WARNING_MESSAGE); 35 } 36 } 37 }
总结
在具体的环境下,最好是对输入数据进行格式检查并做出相应的处理,因为这样能保证程序的正确运行,也避免了使用try-catch 机制,因为从try 开始,程序需要调用更多的资源来做Exception的监控,这样会造成大量的资源占用。当然,在提交数据库事务的时候,try是不能省略的,因为如果没有try,一旦提交失败,连回滚的机会都没有。