2013-11-09 3 views
0

У меня есть файл, который содержит много названий фильмов вместе с их годами, рейтинг из 5 звезд и длины. Я пытаюсь прочитать файл и сохранить названия, год, рейтинг и длину в качестве переменных. Проблема, с которой я столкнулся, заключается в моем коде для получения года. Код компилируется, но затем при запуске бросает исключение NumberFormatException, когда он попадает в фильм с несколькими годами (например, он указан как 2006-2009). Вот мой код.NumberFormatException при анализе целого числа

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 заботиться об этой проблеме?

EDIT: нижеприведенный код - год.

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

Файл форматируется так: title (year) | rating, length К сожалению, я должен был включить, что первоначально.

EDIT # 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 
+3

Могу ли я предложить вам использовать отладчик и посмотреть, что произойдет? –

+1

Распечатайте строку, которую вы пытаетесь проанализировать, или посмотрите на трассировку стека исключений, чтобы увидеть, что на самом деле пытается проанализировать код. Это даст вам проблему и позволит вам найти решение. На самом деле, отправьте свой стек с вашим вопросом, пожалуйста. –

+2

Что такое 'yearStart'? – joval

ответ

2

Что происходит после того, как вы нашли год цикл будет по-прежнему работать, пока.? конец строки, пытаясь выполнить p осел как цифры каждый раз, когда он находит ) или -.

Возможно, вам нужно выйти из цикла после того, как вы нашли год.

   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 
       } 
+0

Yup! Это сделало это. Не могу поверить, что я не думал об этом. Спасибо многому человеку –

0

Поместить Intger.parseInt в Try/поймать блок (подобный приведенному ниже), чтобы увидеть, где это провал и как:

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

Btw: line.indexOf («)») возвращает позицию «(» в строке

+0

«Не удалось разобрать год 2006-2009» в строке «Тиль Смерть» (2006-2009) | 3,7 звезды, 4 сезона » –

+0

Похоже, что другой ответ предложил или вы проверяете неправильный символ ('- 'vs' - ')? –

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; 
    } 

} 
0

Условия if(line.charAt(i) == ')' || line.charAt(i) == '-') справедливо дважды в цикле. Во-первых, когда совпадет дефис, а затем, когда заканчивается закрывающая скобка. В первый раз 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); 
} 

Наконец, более профессиональное решение будет использовать regular expresions, я понимаю, что вы не можете быть знакомы с этим, и, таким образом, я попытался дать ответ, который следует за подобную структуру, как ваша.

+0

Теперь я не уверен, правильно ли я получил ваш вопрос. Я предположил, что вы хотели получить «2005» для фильма, год которого «2005-2009». Если вы хотите получить «2005», а затем «2009», мой код не будет применяться, хотя я бы по-прежнему рекомендовал использовать indexOf – ysmartin

Смежные вопросы