0

多くの映画のタイトルと、その年、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);

            }

line.charAt(i) == '-'私のif文でこの問題を処理すべきではありませんか?

編集: 以下のコードは 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

4 に答える 4

2

年を見つけたらどうなりますか?)ループは行の終わりまで実行され、 aまたは aが見つかるたびに数値として解析しようとします-

年を見つけたら、ループを終了する必要があるかもしれません。

                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または、2 年目を解析できるようにインデックスをリセットする必要があるかもしれません。

                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
                }
于 2013-11-09T20:41:52.443 に答える
0

Intger.parseInt を try/catch ブロック (以下のものと同様) に入れて、これがどこでどのように失敗しているかを確認します。

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

ところで: line.indexOf(')') は、行内の '(' の位置を返します。

于 2013-11-09T20:38:05.783 に答える
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;
    }

}
于 2013-11-09T20:48:44.307 に答える
0

ループ内で条件if(line.charAt(i) == ')' || line.charAt(i) == '-')が 2 回成立します。最初にハイフンが一致したとき、次に閉じ括弧が一致したとき。初めてyear、あなたの例では、に割り当てられます2009。しかしその後、ループが実行され続け、数回の反復の後、"2005-2009"NumberFormatException が発生する解析を試みます。

最も簡単な解決策は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);
}

最後に、より専門的な解決策は正規表現を使用することです。あなたがそれに慣れていない可能性があることを理解しています。したがって、あなたと同様の構造に従う回答を提供しようとしました。

于 2013-11-09T20:52:50.203 に答える