2015-06-17 3 views
2

Я получаю исключение java.lang.NullPointerException, обычно у меня нет проблемы с поиском виновника, но на этот раз я очень смущен.java.lang.NullPointerException при попытке записи в файл excel:

Сначала я подтвердил мой JPQL работает следующим образом:

List<ShopOrder> shopOrders = poRepository.getShopOrder(id); 

      for (ShopOrder<?> order : shopOrders) { 

       System.out.println(order.toString()); 

и в консоли я получил:

ShopOrder [po_id=2, po_number=323, po_due_date=2015-06-16, po_part_id=3, part_quantity=44, part_id=1, part_number=3241, part_decription=Train Hub, plasma_hrs=33.0000, gring_hours=10.0000, mill_hrs=2.0000, breakpress_hrs=4.0000] 

    ShopOrder [po_id=1, po_number=234, po_due_date=2015-06-09, po_part_id=1, part_quantity=3423, part_id=1, part_number=3241, part_decription=Train Hub, plasma_hrs=33.0000, gring_hours=10.0000, mill_hrs=2.0000, breakpress_hrs=4.0000] 

Тогда я решил, что мне нужна более конкретная ошибка. Вот полный метод сниппеты сверху:

@RequestMapping(value = "/generateShopOrder/{id}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE) 
    @Timed 
    public void generate(@PathVariable Long id) throws URISyntaxException { 
     System.out.println("po id to generate = " + id); 

     List<ShopOrder> shopOrders = poRepository.getShopOrder(id); 

     for (ShopOrder<?> order : shopOrders) { 

      System.out.println(order.toString()); 
      try { 
       jobOrderGenerator = new JobOrderGenerator(shopOrders); 
       System.out.println("Printing inside try statement: PO number " + order.getPo_number() + "\nPrinting part id " + order.getPart_id()); 

      } catch (InterruptedException exception) { 

       System.out.println("Something is null " + exception); 
       exception.printStackTrace(); 

      } catch (IOException ex) { 
       System.out.print("Was not able to create job orders,IOexception " + ex); 

      } catch (InvalidFormatException e) { 
       System.out.print("Invalid file format: " + e); 

      } 
     } 

Однако, как вы можете видеть на ошибках (публикуемых в нижней части) только распечатав Println заявления о том, «что-то пустое».

Тогда я подумал, может быть есть что-то происходит с моим файлом, который находится в моей папке ресурсов, так что я проверил его, выполнив следующие действия:

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

     if(file.exists() && file.isDirectory()){ 
      System.out.println("Was was found"); 
     } else { 
      System.out.println("File was NOT found"); 
     } 

     for (ShopOrder shopOrder1 : shopOrder) { 

      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++; 

     } 
    } 

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

     try { 

      XSSFWorkbook workbook = new XSSFWorkbook(file); 

      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); 

      workbook.close(); 

     } catch (IOException e) { 

      System.out.println("Error is writeToSpecificCell class " + e); 
     } 
    } 

Это сказал мне, что это провал перед, если заявление в конструкторе даже не выполняется. Здесь я задаюсь вопросом, где искать дальше. Любой совет?

Ошибка:

Hibernate: select po0_.id as col_0_0_, po0_.po_number as col_1_0_, po0_.due_date as col_2_0_, partlist1_.id as col_3_0_, partlist1_.part_quantity as col_4_0_, part2_.id as col_5_0_, part2_.part_number as col_6_0_, part2_.part_description as col_7_0_, part2_.plasma_hrs_per_part as col_8_0_, part2_.grind_hrs_per_part as col_9_0_, part2_.mill_hrs_per_part as col_10_0_, part2_.brakepress_hrs_per_part as col_11_0_ from T_PO po0_ inner join T_PO_PART partlist1_ on po0_.id=partlist1_.po_id inner join T_PART part2_ on partlist1_.part_id=part2_.id where po0_.id=? 
Hibernate: select po0_.id as col_0_0_, po0_.po_number as col_1_0_, po0_.due_date as col_2_0_, partlist1_.id as col_3_0_, partlist1_.part_quantity as col_4_0_, part2_.id as col_5_0_, part2_.part_number as col_6_0_, part2_.part_description as col_7_0_, part2_.plasma_hrs_per_part as col_8_0_, part2_.grind_hrs_per_part as col_9_0_, part2_.mill_hrs_per_part as col_10_0_, part2_.brakepress_hrs_per_part as col_11_0_ from T_PO po0_ inner join T_PO_PART partlist1_ on po0_.id=partlist1_.po_id inner join T_PART part2_ on partlist1_.part_id=part2_.id where po0_.id=? 
ShopOrder [po_id=2, po_number=323, po_due_date=2015-06-16, po_part_id=3, part_quantity=44, part_id=1, part_number=3241, part_decription=Train Hub, plasma_hrs=33.0000, gring_hours=10.0000, mill_hrs=2.0000, breakpress_hrs=4.0000] 
ShopOrder [po_id=1, po_number=234, po_due_date=2015-06-09, po_part_id=1, part_quantity=3423, part_id=1, part_number=3241, part_decription=Train Hub, plasma_hrs=33.0000, gring_hours=10.0000, mill_hrs=2.0000, breakpress_hrs=4.0000] 
[ERROR] com.htd.aop.logging.LoggingAspect - Exception in com.htd.web.rest.PoResource.generate() with cause = null 
java.lang.NullPointerException: null 
    at com.htd.domain.JobOrderGenerator.<init>(JobOrderGenerator.java:19) ~[classes/:na] 
    at com.htd.web.rest.PoResource.generate(PoResource.java:302) ~[classes/:na] 
    at com.htd.web.rest.PoResource$$FastClassBySpringCGLIB$$cfcd338a.invoke(<generated>) ~[spring-core-4.1.6.RELEASE.jar:na] 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.1.6.RELEASE.jar:4.1.6.RELEASE] 

----------- --------- Обновление

@Aspect 
public class LoggingAspect { 

    private final Logger log = LoggerFactory.getLogger(this.getClass()); 

    @Inject 
    private Environment env; 

    @Pointcut("within(com.htd.repository..*) || within(com.htd.service..*) || within(com.htd.web.rest..*)") 
    public void loggingPointcut() {} 

    @AfterThrowing(pointcut = "loggingPointcut()", throwing = "e") 
    public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { 
     if (env.acceptsProfiles(Constants.SPRING_PROFILE_DEVELOPMENT)) { 
      log.error("Exception in {}.{}() with cause = {}", joinPoint.getSignature().getDeclaringTypeName(), 
        joinPoint.getSignature().getName(), e.getCause(), e); 
     } else { 
      log.error("Exception in {}.{}() with cause = {}", joinPoint.getSignature().getDeclaringTypeName(), 
        joinPoint.getSignature().getName(), e.getCause()); 
     } 
    } 

--------- Обновление 2 ------------

Это утверждение выполнения ошибки:

if (env.acceptsProfiles(Constants.SPRING_PROFILE_DEVELOPMENT)) { 
      log.error("Exception in {}.{}() with cause = {}", joinPoint.getSignature().getDeclaringTypeName(), 
        joinPoint.getSignature().getName(), e.getCause(), e); 

----------- Обновление 3 ------------ Я сделал это, чтобы проверить, была ли среда нулевой, и я ничего не видел в консоли.

@AfterThrowing(pointcut = "loggingPointcut()", throwing = "e") 
    public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { 

     if (this.env==null){ 
      log.error("Environment is null"); 
     } 

------------- Update 4 ------------

ClassLoader classLoader = getClass().getClassLoader(); 

Это то, что возвращается в java.lang .NullPointerException, он даже не попадает:

file = new File(classLoader.getResource("Shop-Order.xlsx").getFile()); 

Вот почему я не мог проверить, если файл был нулевым. Все еще смотря в почему. Когда я решаю это, мне может потребоваться изменить название этого сообщения.

---------- UPDATE 5 --------------

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

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

Теперь я должен выяснить, как передать это в виде файла апача пои

XSSFWorkbook workbook = new XSSFWorkbook(file); 

Он нуждается в файл, а не InputStream.

---------- Update 6 ---------------

После того как я завершил обновление 6, я был в состоянии выяснить, что терпит неудачу. Метод ниже. В консоли печатается:

Inside writeToSpecificCell before try statement 2 0 123 

и

Inside writeToSpecificCell at the beginning of try statement 


void writeToSpecificCell(int rowNumber, int cellNumber, int sheetNumber, String value) throws InvalidFormatException, IOException { 
     System.out.println("Inside writeToSpecificCell before try statement "+cellNumber+" "+sheetNumber+" "+value); 
     try { 
      System.out.println("Inside writeToSpecificCell at the beginnning of 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 at the end of try statement"); 
       workbook.close(); 

     } catch (IOException e) { 

      e.printStackTrace(); 
     } 
    } 
+0

Вы проверили свой аспект ведения журнала? "[ERROR] com.htd.aop.logging.LoggingAspect - Исключение в com.htd.web.rest.PoResource.generate() с причиной = null" не говорит "Что-то есть null", но исключение было выбрано там, где ex .getCause() == null. –

+0

@AndreasAumayr только что обновил код. Теперь сближаемся с этим. – Drew1208

+0

@AndreasAumayr «@AfterThrowing» ловит нулевое исключение, но он не говорит мне, где он, поэтому мне все еще интересно, что может быть черным. – Drew1208

ответ

1

не может быть уверен, потому что источник не показан полностью, но это кажется логичным, что file равна нулю. Это единственное, что упоминалось перед первым выходом в конструкторе. Попробуйте

if (file == null) { 
     System.out.println("file is null"); 
    } else if (file.exists() && file.isDirectory()){ 
     System.out.println("Was was found"); 
    } else { 
     System.out.println("File was NOT found"); 
    } 

Обычно для решения этих проблем, вы должны только нужно смотреть на трассировки стека, он расскажет вам сразу, где проблема. Если это не сработает, как предложил @AndreasAumayr, используйте отладчик и либо перерыв в Exception (значок выглядит как «J!»), Либо в строке, указанной в трассировке стека.

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