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


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

    要求

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

    分析

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

    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                     "请用数字输入年份
    范围是[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,一旦提交失败,连回滚的机会都没有。

  • 相关阅读:
    Codeforces Round #674 (Div. 3)C. Increase and Copy
    Calendar Game
    poj3255Roadblocks
    L2-008 最长对称子串
    L2-004 这是二叉搜索树吗?
    D. Boboniu Chats with Du Codeforces Round #664 (Div. 2)
    暑假了,冲冲冲
    逆元和同余
    懒惰的我
    Codeforces Round #594 (Div. 2) C题
  • 原文地址:https://www.cnblogs.com/test-tech/p/4395990.html
Copyright © 2020-2023  润新知