【问题标题】:Parsing float stored as string should throw Exception解析存储为字符串的浮点数应该抛出异常
【发布时间】:2023-03-08 21:45:01
【问题描述】:

我有一个存储数字的字符串。现在我想解析那个字符串并得到浮点数。

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        try {
            System.out.println(Integer.parseInt("  2  "));
        } catch(NumberFormatException e) {
            System.out.println("Exception caught");
        }
        System.out.println(Float.parseFloat("  2.4  "));

    }
}

现在在上面的代码中如果你运行它就会成功。我的问题是为什么在整数的情况下尾随空格会抛出 NumberFormatException 而解析浮点数不会抛出一个?

PS:布尔和双重解析也是如此。

PPS:为什么 java 有不一致的地方?我已经检查了源代码

【问题讨论】:

  • 为什么不看看源码学习一下呢?或者看看@jens 的回答 ;-)
  • @ScaryWombat 没有必要获取Java的源代码并阅读它来了解方法的作用;该信息应该在方法的 JavaDoc 中。在这种情况下,Float.parseFloat(String) 的 JavaDoc 没有这么说,但它说 ...由 Float 类的 valueOf 方法执行...Float.valueOf(String) 的 JavaDoc 确实说s 中的前导和尾随空白字符被忽略.
  • @SantiBailors 谢谢 - 很棒的评论
  • 调用这个java 中的不一致 有点牵强。它们是两种不同的方法。和你一样,我也没有看到造成这种差异的原因,但是应该向设计师询问这种原因,并且可能有充分的理由或没有。这仍然是解析两种不同类型值的两种不同方法,假设它们以相同方式处理参数是不明智的。
  • @daotan 和 Shaishav 作者没有忘记在 parseInt 中进行修剪,也没有忘记添加 JavaDoc 注释。他们确实提到了 Float 的修剪(见上文),因为它修剪,并且没有提到 Integer 的修剪,因为它不修剪。他们没有提到造成这种差异的原因,但设计决策的原因并不是一个方法的 JavaDoc 应该提到的。

标签: java parsing


【解决方案1】:

在相关源码中可以看到,值会被修剪:

static FloatingDecimal.ASCIIToBinaryConverter readJavaFormatString(String arg) throws NumberFormatException {
    boolean arg0 = false;
    boolean arg1 = false;

    try {
        arg = arg.trim();
     ....

因此,在转换为 floatValue 之前,将删除空格。 更多信息参见FloatingDecimal的源代码,由Float.class调用。

Integer.parseInt()不修剪字符串值:

public static int parseInt(String arg, int arg0) throws NumberFormatException {
    if (arg == null) {
        throw new NumberFormatException("null");
    } else if (arg0 < 2) {
        throw new NumberFormatException("radix " + arg0 + " less than Character.MIN_RADIX");
    } else if (arg0 > 36) {
        throw new NumberFormatException("radix " + arg0 + " greater than Character.MAX_RADIX");
    } else {
        int arg1 = 0;
        boolean arg2 = false;
        int arg3 = 0;
        int arg4 = arg.length();
        int arg5 = -2147483647;
        if (arg4 > 0) {
            char arg8 = arg.charAt(0);
            if (arg8 < 48) {
                if (arg8 == 45) {
                    arg2 = true;
                    arg5 = MIN_VALUE;
                } else if (arg8 != 43) {
                    throw NumberFormatException.forInputString(arg);
                }

                if (arg4 == 1) {
                    throw NumberFormatException.forInputString(arg);
                }

                ++arg3;
            }

            int arg7;
            for (int arg6 = arg5 / arg0; arg3 < arg4; arg1 -= arg7) {
                arg7 = Character.digit(arg.charAt(arg3++), arg0);
                if (arg7 < 0) {
                    throw NumberFormatException.forInputString(arg);
                }

                if (arg1 < arg6) {
                    throw NumberFormatException.forInputString(arg);
                }

                arg1 *= arg0;
                if (arg1 < arg5 + arg7) {
                    throw NumberFormatException.forInputString(arg);
                }
            }

            return arg2 ? arg1 : -arg1;
        } else {
            throw NumberFormatException.forInputString(arg);
        }
    }
}

这就是为什么你会在那里得到一个异常

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2023-03-18
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多