Если условия проверки на выход из цикла написаны в таком порядке, то получаю NullPointerException while (true) { catname = reader.readLine(); if (catname.isEmpty() || catname == null) { break; } Cat cat = CatFactory.getCatByKey(catname); System.out.println(cat.toString()); } Однако если поменять местами условия проверки, то никаких исключений, а собственно в чем отличие этих вариантов, ведь условия разделены логическим ИЛИ? if (catname == null || catname.isEmpty()) {