2015-06-18 1 views
1

Я пытаюсь получить файл excel из папки ресурсов. Этот метод хорошо работает:NPE с текущим потоком Context Class Loader getResourceAsStream (файл)

public JobOrderGenerator(List<ShopOrder> shopOrder) throws InvalidFormatException, IOException { 

     inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("Shop-Order.xlsx"); 

     createJobOrder(shopOrder); 

    } 

Который называет

void createJobOrder(List<ShopOrder> shopOrder) throws InvalidFormatException, IOException{ 


     for (ShopOrder shopOrder1 : shopOrder) { 
      System.out.println("Inside createJobOrder "+shopOrder1.getPo_number()); 
      writeToSpecificCell(2, 1, sheetNumber, shopOrder1.getPo_number()); //Po Number 
      writeToSpecificCell(7, 3, sheetNumber, shopOrder1.getPo_number()); //Part Number 
      LocalDate date = shopOrder1.getPo_due_date(); 
      String dateToString = date.toString(); 
      writeToSpecificCell(1, 2, sheetNumber, dateToString); //Due_Date 
      writeToSpecificCell(7, 5, sheetNumber, Integer.toString(shopOrder1.getPart_quantity())); //Quantity 
      //writeToSpecificCell(1,2,sheetNumber, shopOrder.get); //Material 
      writeToSpecificCell(8, 3, sheetNumber, shopOrder1.getPart_decription()); //Part Description 
      //writeToSpecificCell(1,2,sheetNumber, shopOrder.getCustomer()); //Customer 
      writeToSpecificCell(10, 1, sheetNumber, shopOrder1.getMachine_number()); //Machine 

      sheetNumber++; 

     } 

    } 

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

Inside writeToSpecificCell before try statement 1 0 111 

сразу после того, что является java.lang.NullPointerException:

Поэтому есть что-то происходит с моим файлом excel. Я просто не могу понять, что. Поскольку я получил это как:

inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("Shop-Order.xlsx"); 

Он должен знать местонахождение файла. Поскольку он находится в моем файле ресурсов, а не на моем пути к классу (так что это будет в моем файле jar), мне нужно правильно получить файл в порядке?

Если это важно, я использую Intellji Ultimate, все еще изучая все входы и выходы, я был сильным пользователем затмения.

class path

----------- Update 1 -----------------

inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("/resources/Shop-Order.xlsx"); 

Тем не менее получение же ошибка ...

-------- Update 2 --------------------

try{ 
      ClassLoader classLoader = getClass().getClassLoader(); 

      inputStream = this.getClass().getResourceAsStream("/resources/Shop-Order.xlsx"); 

      if (inputStream == null){ 

       System.out.println("Inputstream is null...."); 
      } 

Просто, чтобы подтвердить я также сделал:

inputStream = this.getClass().getResourceAsStream("/resources/Shop-Order .xlsx"); 

Просто, чтобы подтвердить не было места в Shop-Order.xlsx ...

Это подтверждает, что InputStream является недействительным, поскольку в консоли при печати:

Inputstream is null... 

Из моего Println заявления

метод бросает это пустое исключение здесь ...

void writeToSpecificCell(int rowNumber, int cellNumber, int sheetNumber, String value) throws InvalidFormatException, IOException { 

     System.out.println("inside writeToSpecificCell method before try statement"); 

     try { 
      System.out.println("inside writeToSpecificCell method inside try statement"); 
      XSSFWorkbook workbook = new XSSFWorkbook(inputStream); 

      XSSFSheet sheet = workbook.getSheetAt(sheetNumber); 

      XSSFRow row = sheet.getRow(rowNumber); 
      XSSFCell cell = row.createCell(cellNumber); 

      if (cell == null) { 
       cell = row.createCell(cellNumber); 
      } 
      cell.setCellType(Cell.CELL_TYPE_STRING); 
      cell.setCellValue(value); 
      System.out.println("inside writeToSpecificCell method after try statement"); 
      workbook.close(); 

     } catch (IOException e) { 

      System.out.println("Error in writeToSpecificCell method " + e); 

     }catch(NullPointerException ex){ 
     System.out.println("Null in writeToSpecificCell method"); 
    } 
    } 
+0

Где код, который действительно выбрасывает это исключение, и где находится трассировка стека? – EJP

+0

@EJP См. Обновление 2. – Drew1208

ответ

1

Мне кажется, что у вас есть пространство перед расширением файла. Вы видите, правильно ли я? : P

+0

Это, безусловно, выглядит так. И ['getResourceAsStream'] (https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html#getResourceAsStream-java.lang.String-) возвращает' Входной поток для чтения ресурс или null, если ресурс не найден », последняя часть которого имеет значение. – Powerlord

+0

Нет места ... – Drew1208

+0

Если вы используете maven, дайте ему чистый, а затем пакет – aurelius

0

С точки зрения загрузчика классов, правильное название для этого ресурса: "/resources/Shop-Order. xlsx".

+0

@ EJB см. Обновление 1 – Drew1208

1

Вы также можете рассмотреть getClass().getResourceAsStream("/Shop-Order.xlsx"), это даст вам больше шансов получить соответствующий загрузчик классов.

Как уже отмечалось, файл (на диске) имеет место перед . в соответствии с вашим снимком экрана.

Другим виновником может быть интеграция системы сборки вашей IDE, иногда это может быть исправлено или восстановлено.

+0

Я уже пробовал это и имел ту же проблему. Поскольку это в моем файле ресурсов, который будет в моем файле jar, это не самый предпочтительный способ. Я обращаюсь к файлу внутри файла и пишу ему, поэтому я использовал решение, которое я сделал. Я обновил свою IDE, и это все еще не сработало. Поскольку я использую intellji, я выбрал синхронизацию, и я думаю, что это одинаково для eclipse в отношении обновления. Я немного рад, что это не было проблемой, потому что я бы чувствовал себя огромным немым! – Drew1208

+0

Я не уверен, что я достаточно разбираюсь в том, что вы сказали, если эти файлы собираются и помещаются в один JAR, тогда 'getClass()' даст вам соответствующий загрузчик классов, так как загрузчик, захвативший биты для класса, тот же один из которых располагает ресурсами. –

+0

Для хихиканья, что происходит, когда вы делаете 'getClass(). GetResourceAsStream ("/Shop-Order .xlsx ")' –

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