2

и заблаговременно за помощь. Я довольно новичок в Java и не имел никакого формального образования Java. Я делаю сервер Minecraft Bukkit для практики и регистрирую место регистрации в файле при его создании. Я пытаюсь сделать логическое значение, которое возвращает true, если местоположение уже находится в файле, а false - если нет. Я не могу использовать цикл while, иначе он замораживает сервер, поэтому я использую цикл for. В любом случае, все строки, возвращаемые BufferedReader, являются нулевыми, и я не знаю, почему. У меня есть целое число, которое возвращает количество строк в файле с помощью BufferedReader, которое отлично работает. Я не понимаю, почему он возвращает null с булевым. Вот булево:BufferedReader возвращает Null без видимых причин

код блока:

private boolean isDuplicate(String in) throws IOException 
    { 
     File f = file; 
     try { 
      fr = new FileReader(f); 
      br = new BufferedReader(fr); 
     } catch (FileNotFoundException e1) { 
      log(Level.WARNING, "File not found."); 
     } 
     String temp; 
     in = in.substring(0,in.length() - 1); 
     for(int i = 0; i < (countLines(f)); i++) 
     { 
      if((temp = br.readLine()) != null) 
      { 
       String s = temp; 
       log(temp); 
      } 
     } 
     return false; 
    } 

Вот целое:

private int countLines(File f){ 
     try { 
      fr = new FileReader(f); 
      br = new BufferedReader(fr); 
     } catch (FileNotFoundException e1) { 
      log(Level.WARNING, "File not found!"); 
     } 

     for(int i = 0; i < 100000; i++) 
     { 
      try 
      { 
       if(br.readLine() == null) 
       { 
        return i; 
       } 
      } 
      catch (NullPointerException e) 
      { 
       return i; 
      } 
      catch (IOException e) 
      { 

      } 
     } 
     return 0; 
    } 
+0

в случае, если ваши 'fr' и' br' являются переменными класса (на самом деле они не должны), поэтому вы получаете нуль в isDuplicate(): ваши countlines() сортируют 'выхлопывает' поток br (Я предполагаю здесь, без кода, который на самом деле компилирует, это довольно сложно) – Marco

ответ

2

«очевидная причина» в том, что вы достигли конца файла. Но этот код вздор. Вам не нужно заранее подсчитывать строки ,, и вам, разумеется, не нужно их подсчитывать каждый раз по кругу, что и делает ваш текущий код. В настоящее время ваша обработка O (N), что катастрофично. Просто позвоните readLine(), пока не вернется null:

while ((line = br.readLine()) != null) 
{ 
    // ... 
    log(line); 
} 

NB Там нет никакого способа, что ваш метод isDuplicate() ничего не делает даже немного напоминающим свое название.

+0

нет такой вещи, как 'O (N^2 + N)' - это было бы просто O (N^2); в любом случае 'countlines()' оценивается только один раз в начале цикла. Но, да, вы правы: тест на readLine() возвращает нуль правильно – Marco

+0

@Marco Спасибо, мне было интересно об этом. Исправлена. – EJP

+0

Спасибо всем за вашу помощь, и извините за то, что тратили свое время на мой плохой код. – mineman117

1

Существует довольно много проблем с этим кодом (наиболее вопиющий: когда вы ловите «FileNotFound», вы должны возвращаться и записывать «фатальный» - нет смысла продолжать). Я также предполагаю, что ваш фактический код не тот, который вы показываете (он не будет компилироваться).

В любом случае, вот как вы читаете файл в Java:

public boolean isDuplicate(String lookup, String filename) { 
    try { 
     BufferedReader reader = new BufferedReader(new FileReader(filename)); 
     String line; 
     int lineNo = 0; 
     while ((line = reader.readLine()) != null) { 
      lineNo++; 
      // best would be to use a regex to match against the line 
      // however, the naive approach would be 
      if (line.indexOf(lookup) != -1) { 
       log.info(String.format"Lookup term %s found on line %d", lookup, lineNo); 
       return true; 
      } 
     } 
     log.info(String.format("Lookup term %s not found in %s", lookup, filename); 
     return false; 
    } catch (IOException e) { 
     // log a fatal error and bail 
     log.error(String.format("Could not read from %s [%s]", filename, e.getLocalizedMessage())); 
     // here best practice would be to throw your own custom application ex 
     throw new MyApplicationException(e); 
    } 
} 

while и for как ведут себя по существу, таким же образом; причина, по которой ваш while никогда «не возвращался», вероятно, из-за вашего «истощения» потока в методе countlines().

0

Во-первых, вам не нужна функция countLines или цикл for, который использует его. Вы можете заменить, если Постулаты с

while((temp = br.readLine()) != null) 

Во-вторых, батончиков использует глобальный BufferedReader и, вероятно, закончил читать весь файл. Любой новый br.readLine() теперь возвращает null. Следовательно, когда вы возвращаетесь из функции countlines и пытаетесь выполнить br.readLine(), вы получаете нулевое значение.

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