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

时间:2013-06-04 00:33:54

标签: java type-conversion

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


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

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

非常感谢您的支持。

5 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

没有任何API的Java 8:

#include "stdafx.h"
#include <iostream>
using namespace std;

void modifyArray(int * arr, int len)
{
    for (int i = 0; i < len; i++)
    {
        arr[i] += 1;
    }

}

void printArr(int *arr, int len)
{
    for (int i = 0; i < len; i++)
    {
        cout << arr[i];
    }
    cout << endl;
}

int main()
{
    int arr[5] = { 1,2,3,4,5 };
    cout << "Before :" << endl;
    printArr(arr, 5);    
    modifyArray(arr, 5);    
    cout << endl << "After : " << endl;
    printArr(arr, 5);    
    return 0;
}

答案 4 :(得分:0)

>>> etree.indent(root, space="    ")
>>> print(etree.tostring(root))
<root>
    <a>
        <b/>
    </a>
</root>

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