2017-02-17 4 views
-1

Я знаю путь, чтобы прочитать следующие и предыдущие строки во время чтения файла построчно, какПри чтении следующие и предыдущие строки в файле я получаю исключение разыменования нулевой

String prev = null; 
String curr = null; 
String next = null; 

Scanner sc = new Scanner(new File("thefile.txt")); 

while(sc.hasNextLine()) { 
    prev = curr; 
    curr = next; 
    next = sc.nextLine(); 

Но во время первой Итерация Я получаю исключение нулевого указателя, поскольку мне приходится работать с текущим элементом.

Какое обходное решение для этого?

Scanner sc = new Scanner(file); 

    String curr = null ; 
    String next = null ; 


     while (sc.hasNextLine()) { 

      curr = next; 
      next = sc.nextLine(); 
      if(curr.length() > 0 && !curr.equals(". O O")) { 
       lines+= curr.substring(0, curr.indexOf(" ")) + " "; 

       for(String pat : patStrings) 
       { 
       // System.out.println(pat) ; 
        Pattern minExp = Pattern.compile (pat); 
        Matcher minM = minExp.matcher(curr); 
        while(minM.find()) 
        { 
         String nerType = minM.group(2); 
         if(nerType.contains("B-NE_ORG")){ 
          if (next.contains("I-NE_ORG")) 
           orgName+= minM.group(1)+" "; 
+1

В начале, curr и next являются «нулевыми». На первой итерации вы назначаете «curr = next», поэтому значение по-прежнему остается «null». Затем «curr.length()» выдает исключение nullpointer ... –

+0

http://stackoverflow.com/questions/3983175/1-scanning-current-as-opposed-to-next-line-location-2- scan-line-x-java – lavina

ответ

1

Вы, скорее всего, нужно прочитать две строки первой, чтобы получить переменные настройки правильно

String prev = null; 
String curr = null; 

Scanner sc = new Scanner(new File("thefile.csv")); 

if (sc.hasNextLine()) { 
    curr = sc.nextLine(); 
} 

while (sc.hasNextLine()) { 
    prev = curr; 
    curr = sc.nextLine(); 
} 

Если вам нужны три линии в время, то вы должны фактически прочитать три строки, а затем обработать их.

StringBuilder sb = new StringBuilder(); 
while (sc.hasNextLine()) { 
    sb.setLength(0); // clear the stringbuilder 

    String line = sc.nextLine(); 
    if (line.isEmpty()) continue; // if you want to skip blank lines 
    else sb.append(line).append("\n"); 

    for (int i = 1; i < 3 && sc.hasNextLine(); i++) { 
     line = sc.nextLine(); 
     sb.append(line).append("\n"); 
    } 
    String[] lines = sb.toString().trim().split("\n"); 
    if (lines.length == 3) { 
     String prev2 = lines[0]; 
     String prev1 = lines[1]; 
     String curr = lines[2]; 

     doStringThings(prev2, prev1, curr); 
    } 
} 
+0

Спасибо! Я мог бы сделать с двумя строками, поскольку мне нужно проверить текущий и следующий элементы. В вашем коде у вас есть текущий и предыдущий. Я могу просто поменять их на текущий и следующий справа? – serendipity

+1

Вы должны прочитать дополнительную строку, чтобы получить предыдущие, текущие, ** и следующие **. Я думаю, что мое второе решение будет лучше. Хотя вам нужно выполнить проверку длины на 'lines' –

+0

Используя вторую версию вашего кода, сделана крошечная модификация в том, как вы объявляете построитель строк. Но с помощью этого мой файл считывается с третьей строки вперед, а не на 1-й. \t while (sc.hasNextLine()) { \t \t \t StringBuilder sb = new StringBuilder(); \t \t \t \t для (INT I = 0; I <3 && sc.hasNextLine(); я ++). { \t \t \t \t \t, если (sc.nextLine() длина()> 0 && sc.nextLine() ! = null) \t \t \t \t \t \t sb.append (sc.nextLine()).добавьте ("\ п"); \t \t \t \t} \t \t \t \t String [] = элементы sb.toString() дробление ("\ п."); \t \t \t \t prev = элементы [0]; \t \t \t \t curr = элементы [1]; \t \t \t \t next = elements [2]; – serendipity

1

ли

next = sc.hasNextLine() ? sc.nextLine() : null; 
    while (sc.hasNextLine()) { 
     curr = next; 
     next = sc.nextLine(); 

К тому времени, вы входите в то время цикла, и если файл имеет две или более строк, обработка может начаться в соответствии с вашим кодом.

+1

Спасибо за то, что я понял, что именно я просил! – serendipity

+0

@serendipity, счастливое кодирование! :) –

0

Я не очень уверен, что это помогает, но обменивается позицией curr = next; и next = sc.nextLine(); Ваше решение:

curr = next; 
next = sc.nextLine(); 

Мое предложение:

next = sc.nextLine(); 
curr = next; 
+0

Тогда 'curr' всегда будет' next'. –

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