【问题标题】:how to handle NumberFormatException in more specific way?如何以更具体的方式处理 NumberFormatException?
【发布时间】:2013-01-10 07:00:29
【问题描述】:

我想以更具体的方式处理 NumberFormatException。 当它尝试分配除整数以外的任何内容时,当输入以下内容时会发生此异常:

  1. 字符串
  2. 字符
  3. 空输入
  4. 双数

根据输入的内容,我想显示正确的消息,例如

你输入的是字符串,请输入一个整数

值不能为空,请输入整数值

下面的代码以一般方式捕获NumberFormatException

我想知道有没有办法包含更多的 catch 子句。

    import java.util.Scanner;

    public class TestException {

        static int input;
        static Scanner scan = new Scanner(System.in);

        public static void main(String[] args) {
            System.out.println("Enter an integer number: ");

            try {
                input = Integer.parseInt(scan.next());
                System.out.println("You've entered number: " + input);
            } catch (NumberFormatException e) {
                System.out.println("You've entered non-integer number");
                System.out.println("This caused " + e);
            }
        }
    }

【问题讨论】:

  • 只显示类似的行“您输入了空白或非数字值。请再试一次”??更好吧?
  • 可以在catch子句中分析给定的输入,显然没有内置逻辑来判断字符串作为数字无效的各种任意原因
  • 也用错误代码终止进程。 System.exit(1);
  • 这可能有点矫枉过正,但您可以使用正则表达式来查看它们是数字还是字母或两者的组合的模式。

标签: java exception-handling validation numberformatexception


【解决方案1】:

首先获取用户的输入,然后尝试将其转换为整数。

    static int input;
    static Scanner scan = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.println("Enter an integer number: ");

        String inputString = scan.next();

        try {
            input = Integer.parseInt();
            System.out.println("You've entered number: " + input);
        } catch (NumberFormatException e) {
            if(inputString.equals("") || inputString == null) {
                System.out.println("empty input"); 
            } else if(inputString.length == 1) {
                System.out.println("char input");
            } else {
                System.out.println("string input");
            }
        }
    }

【讨论】:

    【解决方案2】:

    您必须使用if-else 构造在catch 块内指定您的场景。

    请看下面的代码:

    String inString = null;
    try 
    {
        iString = scan.next().trim();
        input = Integer.parseInt(inString);
        System.out.println("You've entered number: " + input);
    } 
    catch (NumberFormatException e) 
    {
        if(inString.equals("")
        {
            System.out.println("You've entered empty string.");
        }
        else if(inString.length() == 1)
        {
            System.out.println("You've entered a single char");
        }
        else
        {
            System.out.println("You've entered non-intereger number");
        }
        System.out.println("This caused " + e);
    }
    

    【讨论】:

    • 我正在使用 Eclipse。当我刚按 Enter 时,这是一个空字符串,但您的代码不检查第一个条件,所以它转到最后一个“else”条件
    【解决方案3】:

    如果将输入解析为整数值导致异常,您可以对输入进行更多测试,如下所示:

    String scanned = null
    try {
       scanned = scan.next();
       input = Integer.parseInt(scanned);
       System.out.println("You've entered number: " + input);
    } catch (NumberFormatException e) {
       if (scanned == null || scanned.isEmpty()) {
          System.out.println("You didn't enter any value");
       } else if (scanned.length() == 1)
          System.out.println("You entered a single char which is not a number");
       }
       // and more tests, you can even try to parse as Double
    }
    

    【讨论】:

    • scanned.size() -->scanned.length()
    【解决方案4】:
    String aString = null;
        aString = scan.next().trim();   
        System.out.println("You've entered number: " + aString);
        if("".equals(aString.trim())){
           System.out.println("You have entered an Empty String");
         }else if(!isNumber(aString) && aString.length()==1){
           System.out.println("You have entered a Character");
         }else if(!isNumber(aString) && aString.length()>1){
           System.out.println("You have entered a String");
         }else if(isNumber(aString)){
           int input = Integer.parseInt(aString.replaceAll(",",""));
           System.out.println("You have entered a correct Number"+input); 
         }
    
       private boolean isNumber(String s){
            return s.matches("[0-9]+(,[0-9]+)*,?");
        }
    

    【讨论】:

    • 这将抛出 NumberFormatException 而不会捕获它,从而结束程序(并且数字正则表达式也不正确)。
    • 不,它不会因为您不再将输入转换为int,这是 OP 想要做的。并且正则表达式仍然是错误的。
    • 正则表达式已经为我工作了。如果您输入 1,000,只需检查 regx 它也可以工作并为您提供正确的 o/p。
    • 现在我明白了,正则表达式对你有用,因为你替换了所有的逗号。但是你的正则表达式可以像\\d[\\d,]* 这样更容易编写。现在您需要修复的只是变量input 的范围。
    【解决方案5】:
    public static int isInt(){
            boolean ok=false;
            int b=1;
            do{
                String next = sc.next();
                int a=b;
                try{
                 a = Integer.parseInt(next);        
                }catch(Exception e){
    
                    System.out.println("Invalid Option...");
                    continue;
                }
    
    
                if(a==1){b=a;ok=true;}
                else if(a==2){b=a;ok=true;}
                else if(a==3){b=a;ok=true;}
    
            }while(!ok);
        return b;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2015-11-11
      • 2011-10-26
      • 1970-01-01
      相关资源
      最近更新 更多