我想将java.lang.String转换为java.lang.Integer,如果0是不可转换的,则分配默认值String。这是我想出的。我希望能评估这种方法。

老实说,这对我来说有点奇怪:

#1 楼

这是一个解决方案:

int tryParseInt(String value) { 
 try {  
     return Integer.parseInt(value);  
  } catch(NumberFormatException nfe) {  
      // Log exception.
      return 0;
  }  
}


您应该捕获NumberFormatException而不是异常。

评论


\ $ \ begingroup \ $
+1,用于捕获正确的异常并使用parseInt(),以便可以返回缓存的Integer而不是保证返回新实例。
\ $ \ endgroup \ $
–unholysampler
2012-12-19 14:09

#2 楼

我会考虑使用Apache Commons Lang的NumberUtils.toInt来做到这一点:

public static int NumberUtils.toInt(java.lang.String str, int defaultValue)


该实现使用已经提到的Integer.parseInt以及附加的null检查。 br />另请参见:有效Java,第2版,第47条:知道和使用库(作者仅提及JDK的内置库,但我认为其他库也可能适用。)

评论


\ $ \ begingroup \ $
极好的建议!我非常感谢Apache Commons库。
\ $ \ endgroup \ $
– janoulle
17年9月19日在16:56

#3 楼

正如其他人指出的那样,您的代码永远不应捕获Exception。这样做会引起各种问题。除了给出的答案之外,我还建议您不要将值默认设置为0,而应使其更通用。例如

public static int parseInteger( String string, int defaultValue ) {
  try {
    return Integer.parseInt(string);
  }
  catch (NumberFormatException e ) {
    return defaultValue;
  }
}


#4 楼

您不应使用new Integer( string ),而应使用Integer.valueOf( string )。如之前在许多其他线程中所讨论的,由于valueOf可以查找较小的整数值并减少了创建新对象的开销,因此它可能会更快。

#5 楼

只是有点学究:

public static final int iDEFAULT_DEFAULT_PARSED_INT = 0;

public static int ifIntFromString( String sToParse) {
    return ifIntFromString( sToParse, iDEFAULT_DEFAULT_PARSED_INT );
}

public static int ifIntFromString( String sToParse, int iDefaultValue ) {
    int iReturnValue = null;
    try {
        iReturnValue = Integer.parseInt(sToParse);
    } catch ( NumberFormatException e ) {
        iReturnValue = iDefaultValue;
    }
    assert (null != iReturnValue) : "Impossible - no return value has been set!";
    return iReturnValue;
}


如果有一种方法可以做到这一点而不必捕获异常(由于性能),那真是太好了问题),而不必自己编写解析代码-但这就是基础库为我们提供的功能。

评论


\ $ \ begingroup \ $
匈牙利记号实际上是没有必要的...
\ $ \ endgroup \ $
–叙利亚
2012年12月24日19:37

\ $ \ begingroup \ $
@assylias:嗯,仅是为了保持较高水平的学究主义... :-)
\ $ \ endgroup \ $
–理查德·阿诺德·米德(Richard Arnold Mead)
13年1月3日,0:41

\ $ \ begingroup \ $
它不会编译(无法从null转换为int)。
\ $ \ endgroup \ $
–palacsint
13年1月8日在22:16

\ $ \ begingroup \ $
@palacsint阿克!谢谢-麻烦了。语言太多-我很抱歉。在Java中,null是仅具有自身标识的一阶令牌(如果我没记错的话),而在许多其他语言(例如C / C ++)中,n等于整数零。在这种情况下,我的意图是将null用作“非值”,以指示在设置变量但仍对其进行初始化时失败。我应该使用Integer对象而不是int类型,然后将Integer转换为int作为返回值。
\ $ \ endgroup \ $
–理查德·阿诺德·米德(Richard Arnold Mead)
2013年1月8日22:32

#6 楼

Java中的解析方法将字符串转换为Int
在Java中,有两种方法将字符串转换为Int,它们是:
Integer.parseInt()
Integer.valueOf()


使用Integer.parseInt()将字符串转换为Int
Integer.parseInt()是Java中用于将字符串转换为原始整数的Integer类的静态方法。将一种数据类型转换为另一种数据的过程。例如,将String转换为整数。编码部分请参考:将字符串转换为int的最佳方法

#7 楼

在Java中创建和抛出Exception的性能成本通常可以比通常验证值的转换高得多,并且通常比这种方法花费更多。对于所有我知道的JVM(IBM的Java,Oracle的Java,OpenJDK等),异常的开销通常在抛出异常时相对于调用堆栈深度呈线性比例,因此深度嵌套的异常代价更高最重要的是,在好的代码中,绝对不要(只有很少的例外)将例外作为正常/预期代码流的一部分。

因此,在您的情况下,我将通过尽最大的努力消除异常情况,同时仍然适当地处理异常,来最大程度地减少异常的可能性。 for Double.valueOf(String)暗示了这一点,并且还提供了一个正则表达式,可用于检查valueOf是否可能引发异常。

有效数字,在大多数情况下,可以大大提高处理无效数字的性能,根据我的经验,这种权衡是不值得的。