Findbugs Возможное разыменование нулевого указателя в java

Я использую FindBugs для обнаружения ошибок, содержащихся в коде. Я нашел некоторые решения некоторых ошибок, однако я не могу понять, почему он все еще показывает ошибку «Возможное разыменование нулевого указателя» в строке проверки «микро». В цикле while я показал, что мой ввод должен отличаться от нулевого значения, однако он по-прежнему показывает, что ошибка существует. Если можно, подскажите, как это исправить, пожалуйста? Заранее спасибо! Код ниже:

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.Charset;


public class FindBug {

    public static void main(String args[]) 

    {


        InputStreamReader reader = new InputStreamReader(System.in,Charset.defaultCharset());
        BufferedReader bufferedreader = new BufferedReader(reader);

        String scan = null;

        boolean nextfound=false;

        try 
        {
           while(null!=(scan= bufferedreader.readLine())&&nextfound)

            {
              scan=scan.replace('i', 'a');

            }
        } 
        catch (IOException ioex) 
        {
            System.err.println(ioex.getMessage());
        }

        if (scan.equals("micro")) 
        {
            System.out.println("The result is macro!");
        } 


        else

        {
            System.out.println("Something else!");
        }
    }
}

person Shahin    schedule 04.10.2016    source источник
comment
readLine() выдает исключение   -  person chrylis -cautiouslyoptimistic-    schedule 04.10.2016
comment
Возможно, ваше условие while не выполняется, и в этом случае строка сканирования будет нулевой.   -  person Will_Panda    schedule 04.10.2016
comment
readLine() вызывает IO exception, чтобы исправить это, используйте блок finally, закройте br в finally block.   -  person Prasanna Kumar H A    schedule 04.10.2016
comment
Возможный дубликат Что такое исключение NullPointerException и как его исправить?   -  person Nissa    schedule 04.10.2016


Ответы (2)


scan может быть null и, возможно, вы можете просто инвертировать свой тест

if ("micro".equals(scan){
   System.out.println("The result is Macro!")
}

а так же есть ошибки:

scan=scan.replace('i', 'a'); никогда не будет выполняться, потому что nextfound всегда равно false

while(null!=(scan= bufferedreader.readLine())&&nextfound)
{
    scan=scan.replace('i', 'a');
}

bufferReader никогда не закрывается, вы должны добавить блок finally в свой код

...
catch (IOException ioex) {
    System.err.println(ioex.getMessage());
} finally {
    try {
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
person Dams    schedule 04.10.2016

Если ваш ввод пуст, ваш цикл while не будет выполняться. scan будет установлено на null, и вуаля, NullPointerException.

person Joe C    schedule 04.10.2016