我有一个文件,其中包含许多电影以及他们的年份,评分超过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
答案 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,我知道你可能不熟悉它,因此我试图提供一个与你的结构类似的答案。