以安全的方式将字符串转换为整数

2022-09-03 01:20:35

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


版本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应该是我的小程序中的“错误值”,换句话说,所有三个版本的方法在我的程序中都可以完美地工作。

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

非常感谢您的支持。


答案 1

Guava为此提供了一个实用程序方法,如果您的字符串无法解析,它将返回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

答案 2

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

版本是可以的,但它使调用方更改编码风格:调用方需要始终检查错误,而不是捕获错误并将其与其他错误一起处理。在读取多个整数的情况下,这可能是次优的,但错误处理不依赖于哪个特定整数失败。此外,使用您的 API 的新编码人员可能会忘记检查 ,并无意中使用错误代码。B-1-1

这就是为什么我会坚持第一种选择:对于任何了解Java API的人来说,使用版本的代码看起来会立即熟悉,而无需了解函数中发生了什么。A