解析为 Double 时捕获 numberformatException

Posted

技术标签:

【中文标题】解析为 Double 时捕获 numberformatException【英文标题】:Catching numberformatException while parsing to Double 【发布时间】:2013-01-01 20:10:22 【问题描述】:

我想在某些条件下验证输入集。 在这里,我在解析号码时收到NumberFormatException。如果在文本框中输入的数字包含除数字以外的任何内容,我想抛出 InvalidInputException。 现在,如果我只输入数字,那么我也会得到NumberFormatException。 这是示例代码。 调用validateInput如下

 try 
                    if (true == validateInput(name.getText().toString(), number
                            .getText().toString())) 
                        // do something
                    
                 catch (InvalidInputException iie) 
                    Log.d("@gaurav", "not a valid input" + iie);
                    Toast.makeText(this, "Invalid input set", Toast.LENGTH_LONG)
                    .show();
                 catch (Exception ex) 
                    Toast.makeText(this, "Problem while cerating contact", Toast.LENGTH_LONG)
                    .show();
                    Log.d("@gaurav", "Problem while cerating contact", ex);
                 finally 
                 // do something    
                

ValidateInput()如下:

 * Name is valid if it starts with an alphabet otherwise not valid Number is
 * valid if the entered text is integer only, 
 * if not valid number/name throws InvalidInputException, otherwise true
 * */
private boolean validateInput(String name, String number)
        throws InvalidInputException 
    InvalidInputException iie = new InvalidInputException();
    try 
        if (name.isEmpty() || number.isEmpty()) 
            Log.d("@gaurav.exception", "input field empty");
            iie.addDescription("Input field is empty");
            throw iie;
         else 
            if (false == Character.isLetter(name.charAt(0))) 
                Log.d("@gaurav.exception", "first letter of name is not a letter");
                iie.addDescription("first letter of the name is not character");
                throw iie;
            
            Log.d("@gaurav.exception", "checking number");
        Log.d("@gaurav.exception","number is :"+number+":");                  
            Double.parseDouble(number);
        
     catch (NumberFormatException e) 
        Log.d("@gaurav.exception", "In numberFormatexception, adding description, re-throwing iie");
        iie.addDescription("Number field should contain integer only");
        throw iie;
    
    catch (Exception e) 
        Log.d("@gaurav.exception", "Exception, re-throwing iie");
        throw iie;
    
    iie = null;
    return true;

MyCustomException如下

package com.gaurav.contactmanager.model;

public class InvalidInputException extends Exception 
    /**
     * 
     */
    private static final long serialVersionUID = 5585822470459144546L;
    String description;

    public InvalidInputException() 
        super();
    

    public InvalidInputException(String desc) 
        this.description = desc;
    

    public void addDescription(String desc) 
        description = desc;
    

    @Override
    public String toString() 
        return description + "\n\n" + super.toString();
    


Logcat 显示如下:

01-02 02:11:59.310: D/@gaurav.exception(408): checking number
01-02 02:11:59.321: D/@gaurav.exception(408): number is :6666:
01-02 02:11:59.330: D/@gaurav.exception(408): In numberFormatexception, adding description, re-throwing iie
01-02 02:11:59.330: D/@gaurav(408): not a valid inputNumber field should contain integer only
01-02 02:11:59.330: D/@gaurav(408): com.gaurav.contactmanager.model.InvalidInputException

【问题讨论】:

不要使用true == conditionfalse == condition,分别使用condition!condition 代替。 @martijno 这是为了我的方便,因为它提高了我的可读性,但我猜问题出在“Double.parseDouble(number)”,因为日志表明它正在检查数字,然后陷入异常 从你的堆栈跟踪看起来代码工作正常,假设传递的数字不是有效的双精度数。您能否将有问题的值包含在日志中,最好在 [] 之间,以确保周围没有空格。您的代码和日志中没有任何内容可以假设此字符串变量包含双精度的有效表示。 当然我也会检查这种情况,因为这似乎会导致问题 6666 是什么号码?确定你真的输入正确了吗? 6666 vs 6666 .... 只是想知道您使用的是哪种编码? 【参考方案1】:

你正在尝试做

 Double.parseDouble(number);

除了可以解析为 Double 的输入之外,这对任何输入都不起作用。

你可能想做类似的事情

try
     Double.parseDouble(number);
catch(NumberFormatException e)

    throw iie;

【讨论】:

这里 Double.parseDouble(number);已经在 try 块中,并且它也在捕获异常。我以字符串格式输入 999 作为数字并得到此异常。我怀疑这个解决方案是否可行,但我仍然会给它一个机会,让你知道可以吗【参考方案2】:

我输入的数字的类型/格式存在一些问题,这是问题的根本原因。尝试在其他设备上运行相同的代码确认这是输入类型/格式问题。

【讨论】:

以上是关于解析为 Double 时捕获 numberformatException的主要内容,如果未能解决你的问题,请参考以下文章

将 Double 解析为特定格式

硒WD |使用 String 解析为 double 后出现异常错误

在 Pyspark 中旋转时无法解析列名

关于Integer 和Double包装类创建对象时的底层解析

Integer.valueOf() 与 Integer.parseInt() [重复]

更新到 HttpClient 时:解析期间未捕获 Promise/Http Failure