有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java安全地将字符串转换为整数

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


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

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

非常感谢您的支持


共 (6) 个答案

  1. # 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友好

  2. # 2 楼答案

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

    版本B是可以的,但它会让调用者改变编码风格:调用者不需要捕捉错误并将其与其他错误一起处理,而是需要一直检查-1。在读取多个整数的情况下,这可能是次优的,但错误处理并不取决于哪个整数失败。此外,使用API的新程序员可能会忘记检查-1,并在无意中使用错误代码

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

  3. # 3 楼答案

    没有任何API的Java 8:

     Optional.ofNullable(strNum)
             .map(Integer::valueOf).orElse(null);
    
  4. # 4 楼答案

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

    public static Integer safeStringToInt(String param) {
        return Optional.ofNullable(param).map(Ints::tryParse).orElse(null);
    }
    
  5. # 6 楼答案

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

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