17

我有一个小方法,除其他外,它还可以将字符串转换为整数。由于字符串是方法的参数,我想确保该字符串是可转换的。所以我只是想知道什么是最安全和/或最快的方法。


版本 A:保持原样并承担风险(我试图避免)

public static int stringToInt(String param) {
        return Integer.valueOf(param);
}

(在速度方面,它对版本 B 和 C 有什么样的影响?)


版本 B:捕获异常

public static int stringToInt(String param) {
        try {
                return Integer.valueOf(param);
        } catch(NumberFormatException e) {
                return -1;
        }
}

版本 C:检查字符串的每个字母以查看是否为数字

public static int stringToInt(String param) {
        for(char c : param.toCharArray()) {
                if(!Character.isDigit(c))
                        return -1;
        }
        return Integer.valueOf(param);
}

请注意,参数必须是正数,并且 -1 应该是我的小程序中的“错误值”,换句话说,所有三个版本的方法在我的程序中都可以正常工作。

我非常愿意接受您可以给我的任何其他建议,因此,如果您认为自己的版本更好,请随时创建自己的版本。

非常感谢您提前的支持。

4

6 回答 6

12

Guava 为此提供了一个实用方法,如果您的 String 无法解析,它会返回 null。

https://google.github.io/guava/releases/19.0/api/docs/com/google/common/primitives/Ints.html#tryParse(java.lang.String)

Integer result = Ints.tryParse("1");  //returns 1
Integer result = Ints.tryParse("-1"); //returns -1
Integer result = Ints.tryParse("a");  //returns null
于 2014-07-29T16:14:10.923 回答
7

首先,请注意版本C不是防弹的:它会拒绝负数,并且不会捕获太大的数字。

版本B没问题,但它使调用者改变了编码风格:调用者需要一直检查,而不是捕获错误并将其与其他错误一起处理-1。在您读取多个整数的情况下,这可能不是最理想的,但错误处理并不取决于哪个特定的整数失败。此外,使用您的 API 的新编码人员可能会忘记检查-1并无意中使用错误代码。

这就是为什么我会选择第一个选项:A任何了解 Java API 的人都会立即熟悉使用版本的代码,而无需了解函数内部发生了什么。

于 2013-06-04T00:44:03.323 回答
2

我相信修改后的 B 抛出异常而不是返回 -1 将是最佳选择。最好将异常抛出到某个级别,在该级别可以对其进行处理以向用户发送正确的响应。返回像 -1 这样的值会使您的代码容易出错。假设另一个程序员正在使用您的方法,并且他/她只有您的方法的签名。因此,从签名中不清楚他/她应该编写什么代码来处理异常或错误场景。但是,如果您抛出异常并将其添加到您的方法声明中,那么它将使其他程序员能够正确使用您的方法以及所需的异常处理。对我来说,这看起来是最好的:

public static int stringToInt(String param) throws NumberFormatException {
        try {
                return Integer.valueOf(param);
        } catch(NumberFormatException e) {
               // return -1;
               throw e;
        }
}
于 2013-06-04T00:45:59.250 回答
1

没有任何 API 的 Java 8:

 Optional.ofNullable(strNum)
         .map(Integer::valueOf).orElse(null);
于 2018-11-09T09:14:49.923 回答
1
public int stringToInt(String param) throws NumberFormatException {

    Optional.ofNullable(param.replaceAll("\\s+", ""))
         .map(Integer::valueOf).orElse(null);

/*
                      or

    Optional.ofNullable(param.replaceAll(" ", ""))
         .map(Integer::valueOf).orElse(null);

*/

}

使用 replaceAll 替换空格加号是 cpu 友好的,即使似乎不需要。

于 2020-02-17T17:36:01.670 回答
0

我使用了 2 个答案的组合来确保空值、空字符串或空白字符串以及非数字字符的安全:

public static Integer safeStringToInt(String param) {
    return Optional.ofNullable(param).map(Ints::tryParse).orElse(null);
}
于 2021-10-11T09:58:38.110 回答