【问题标题】:number format exception error handling数字格式异常错误处理
【发布时间】:2015-11-12 16:16:11
【问题描述】:

我有一个用数字填充的字符串数组。默认情况下,数组中任何未设置的元素都是null。然后我遍历这个数组,将字符串解析为它们的int 值,但是当循环到达null 元素时,我遇到了NumberFormatException。

我事先不知道数组中有多少个数字,所以我使用一个大数组来确保有足够的空间容纳所有字符串。

如何在循环到达null 元素之前停止循环?

for (int x = 1 ; x < array1.length ; x++){
    int newnode = Integer.parseInt(array1[x]);
    //searching in matrix
    // do other stuff
}

【问题讨论】:

  • 使用List而不是数组可以避免这个问题

标签: java loops numberformatexception


【解决方案1】:

如果您不知道每次将要处理的元素数量,请使用动态大小的集合而不是固定大小的数组。

将填充您的集合的代码更改为使用List&lt;String&gt; 而不是String[]。列表是动态大小的,并且会随着您向其中添加更多元素而不断增长。迭代时不会返回任何 null 元素,除非您首先特别添加它们,因此您的代码将永远不会尝试解析 null 值。

然后,此更改将允许您像这样迭代列表:

for (String number : array1) { // You might want to rename array1 to something meaningful...
    int newNode = Integer.parseInt(number);
    // Do other stuff
}

如果需要,您仍然可以维护一个单独的索引变量,它只需手动声明和递增,而不是作为循环构造的一部分。

【讨论】:

  • 应该在 Integer.parseInt() 周围使用 try catch 块,因为它可以抛出 NumberFormatException 出于多种原因,您可能不希望程序在那时停止。
  • @MichaelShopsin 这取决于列表的内容。如果您可以控制源和创建列表的代码,则可以确保首先将有效数据插入其中。在这种情况下,您可能会争辩说,此时的失败表明代码早期存在更基本的错误。它还可能表明数据处于无效状态并且不应继续处理。如果可以忽略无效数据,那么一定要捕获异常并继续处理......如果不能,不要。
  • Nov 以我的经验Integer.parseInt() 是它过于敏感,所以我通常会捕获异常,然后尝试以另一种方式解析数字。
  • @MichaelShopsin 但是,如果您确保数据在入口处有效,那么稍后捕获 NFE 就像死代码一样好。我宁愿在可能的情况下快速拒绝坏数据,而不是让它存在于应用程序中,以便稍后在某个未知点失败。
  • 有时我正在读取一个文件或其他输入,而我无法控制输入的内容,并且不想在每个错误时停止整个输入。当我阅读一系列 XML 文件时,我不想因为单个数字错误而停下来,因为它们不会对结果产生重要影响。 How to avoid Number Format Exception in Java 中有一个很好的讨论,关于完全验证字符串中的数字。
【解决方案2】:

我认为这是真的:

for (int x = 1 ; x < array1.length ; x++){
    int newnode = -1;
    if(array1[x].equals("")) 
        break;
    try{
        newnode = Integer.parseInt(array1[x]);
    }catch(NumberFormatException e){
        System.err.println("err");
    }
    //searching in matrix
    // do other stuff
}

【讨论】:

  • 有比 try-catch 更好的解决方案来避免这个问题
  • @JonK 我的解决方案没有错,所以我不明白你为什么不赞成我的回答:?
  • 查看我的第一条评论。它可能很有效,但这并不意味着它是一个好的解决方案。
  • 如果是这种情况,您可以将整个程序包装在 try catch 中。我认为这是不好的形式,并且无助于 OP 理解异常传播。
  • 所以你不会知道什么样的异常引发了标志。在 catch 块中指定异常类型时,非常精确始终是最好的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 2011-04-03
相关资源
最近更新 更多