解析整数时的NumberFormatException

时间:2013-11-09 20:23:59

标签: java numberformatexception

我有一个文件,其中包含许多电影以及他们的年份,评分超过5星,以及长度。我正在尝试读取文件并将标题,年份,评级和长度存储为变量。我遇到的问题是在我的代码中检索年份。代码编译,但是在运行时,当它到达具有多年的电影时会抛出NumberFormatException(例如,它被列为2006-2009)。这是我的代码。

while((line = bufferedReader.readLine()) != null) {
                //System.out.println(line);
                for(int i = 0; i < line.length(); i++)
                {

                    if(line.charAt(i) == ')' || line.charAt(i) == '-')//get year
                    {
                        yr = line.substring(yearStart,i);
                        year = Integer.parseInt(yr);
                    }

                }
                System.out.println(year);

            }

我的if语句中line.charAt(i) == '-'不应该处理这个问题吗?

编辑:以下代码是yearStart的来源。

if(line.charAt(i) == '(')//get title
                    {
                        title = line.substring(0,i);
                        yearStart = i+1;
                    }

文件的格式如下: title (year) | rating, length 对不起,我本来应该把它包括在内。

编辑#2:这是文件的一部分示例,如果有帮助的话

!Women Art Revolution (2010) |   3 stars, 1hr 22m
#1 Cheerleader Camp (2010) |   3 stars, 1hr 35m
$5 a Day (2008) |   3.4 stars, 1hr 37m
'night, Mother (1986) |   3.7 stars, 1hr 36m
'Til Death (2006-2009) |   3.7 stars, 4 Seasons//This is the one that causes the error
@Suicide Room (2011) |   3.4 stars, 1hr 51m
... And God Spoke (1993) |   2.8 stars, 1hr 22m

4 个答案:

答案 0 :(得分:2)

找到这一年后会发生什么?循环仍然会一直运行到行尾,尝试在每次找到)-时将数据解析为数字。

也许你应该在找到年份后退出循环。

                if(line.charAt(i) == ')' || line.charAt(i) == '-')//get year
                {
                    yr = line.substring(yearStart,i);
                    year = Integer.parseInt(yr);
                    break; // year found, no point in looping more
                }

或许您应该重置yearStart索引,以便解析第二年。

                if (line.charAt(i) == '-')
                {
                    // parse first year
                    yr = line.substring(yearStart,i);
                    year = Integer.parseInt(yr);
                    yearStart = i + 1; // reset to parse second year
                }
                else if (line.charAt(i) == ')')
                {
                    yr = line.substring(yearStart,i);
                    year = Integer.parseInt(yr);
                    break; // year found
                }

答案 1 :(得分:0)

将Integer.parseInt放在try / catch块中(类似于下面的块)以查看失败的位置以及如何:

try { 
  year = Integer.parseInt(yr);
} catch (Exception e) {
  throw new RuntimeException(
      "Failed to parse year '" + yr + "' in line '" + line + "'", e);
}

Btw:line.indexOf(')')返回'(''在行中的位置。

答案 2 :(得分:0)

找到第一年后,yearStart仍然是第一年的指数。因此,当您尝试获取subString时,它仍为(2006-2009) - 自动NumberFormatException,无法解析-

您应该在找到第一年后更改yearStart

for(int i = 0; i < line.length(); i++)
{

    if(line.charAt(i) == ')' || line.charAt(i) == '-')//get year
    {
          yr = line.substring(yearStart,i);
          year = Integer.parseInt(yr);
          yearStart = i + 1;
    }

}

答案 3 :(得分:0)

条件if(line.charAt(i) == ')' || line.charAt(i) == '-')在循环中保持两次。首先,当连字符匹配时,然后,当右括号匹配时。在您的示例中,第一次year被分配给2009。但是,循环继续运行,稍后进行几次迭代,您尝试解析导致NumberFormatException的"2005-2009"

最直接的解决方案是在分配年份之后break;循环,以便year仅分配一次。也就是说,假设您想获得间隔的起始值。

更清洁的解决方案是完全避免循环,而是明智地使用String.indexOf。这样的事情(免责声明:未经测试)。

String title;
int year;

while((line = bufferedReader.readLine()) != null) {

    title = line.substring(0, line.indexOf('('));

    int yearStart = line.indexOf('(') + 1;
    int yearEnd;
    if (line.indexOf('-', yearStart) > 0 ) {
        yearEnd = line.indexOf('-', yearStart);
    } else {
        yearEnd = line.indexOf('(', yearEnd);
    }

    int yr = line.substring(yearStart,i);
    year = Integer.parseInt(yr);

    System.out.println(year);
}

最后,一个更专业的解决方案会使用regular expresions,我知道你可能不熟悉它,因此我试图提供一个与你的结构类似的答案。