闰年的检查和数字转化错误的处理

闰年的检查和数字转化错误的处理

要求

         在输入框中输入年份,点击确定以后显示该年是否是闰年。

分析

         程序编写中要注意的问题有以下几点

  1. 年份一定是在公元后,所以输入年份不小于0.
  2. 输入内容的规范性。规范的输入要求要以数字或者负号打头,其余是数字字符串,并且数字的范围会受到计算机的表示范围限制。其余输入会被提示输入不规范。所以要考虑两个方面,一是输入的范围具体数据类型表示范围,因为实际用到的年份很难超出[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                     "请用数字输入年份\n范围是[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捕捉错误的实现方法
使用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,一旦提交失败,连回滚的机会都没有。

 

posted @ 2015-04-06 15:12  12218064-测试技术  阅读(214)  评论(1编辑  收藏  举报