以安全的方式将String转换为Integers

fel*_*itz 16 java type-conversion

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


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

public static int stringToInt(String param) {
        return Integer.valueOf(param);
}
Run Code Online (Sandbox Code Playgroud)

(就速度而言,它会对版本B和C产生什么样的差异?)


版本B:抓住异常

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

版本C:检查字符串的每个字母,看它是不是数字

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

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

我对你可以给我的任何其他建议持开放态度,所以如果你认为自己的版本更好,请随意创建自己的版本.

非常感谢您的支持.

use*_*878 9

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
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果 string 为 null,Ints.tryParse(String string) 将抛出 NullPointerException。 (3认同)

das*_*ght 7

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

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

这就是为什么我会A坚持使用第一个选项:使用版本的代码对任何了解Java API的人来说都很熟悉,而无需了解函数内部发生的事情.