2013-03-24 1 views
0

loadDatabase() 메서드가 있습니다. 메서드 자체가 완벽하게 작동합니다.별도의 스레드에서 메서드를 호출하면 NullPointerException이 발생합니다.

별도의 스레드를 만들고 loadDatabase() 메서드를 호출하면 아래와 같은 오류가 발생합니다. 주 스레드에서 잘 작동합니다.

아이디어가 있으십니까? 주 : causecode, eventid 및 description 값은 화면에 인쇄 했으므로 null이 아닙니다. 스레드

@Override 
     public void run() 
     { 
     HelloWorld(); 

     } 

1802에 대한 클래스

오류

15:59:58,693 INFO [stdout] (Thread-64) Importing EcentCauseSheet 
15:59:58,694 INFO [stdout] (Thread-64) Cause Code is 0 
15:59:58,694 INFO [stdout] (Thread-64) Event Id 4097 
15:59:58,695 INFO [stdout] (Thread-64) Description is RRC CONN SETUP-SUCCESS 
15:59:58,703 ERROR [stderr] (Thread-64) Exception in thread "Thread-64" java.lang.NullPointerException 
15:59:58,704 ERROR [stderr] (Thread-64)  at com.testapp.service.EntryConfig.loadDatabase(EntryConfig.java:131) 
15:59:58,704 ERROR [stderr] (Thread-64)  at com.testapp.service.EntryConfig.HelloWorld(EntryConfig.java:48) 
15:59:58,704 ERROR [stderr] (Thread-64)  at com.testapp.service.EntryConfig.run(EntryConfig.java:39) 

자바 코드

@Stateful 
@LocalBean 
public class EntryConfig extends Thread implements TableDao { 

    @Inject 
    private EntityManager em; 
//....... 

자바 코드 IC 무효하여 HelloWorld()는 컨테이너에 의해 passivated 수 있기 때문에 상태 저장 EJB에서 스레드를 확장 {

try { 
     loadDatabase();   

    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

loadDatabase에 대한 자바 코드()

public void loadDatabase() 
    { 
     InputStream inp = null; 
     System.out.println("Eureka Kind of ....."); 
     try { 
      inp = new FileInputStream("/home/ubuntu/Downloads/test.xls"); 

     } catch (Exception ex) { 
     } finally { 
      try { 
       wb = WorkbookFactory.create(inp); 
      } catch (InvalidFormatException e) { 

       e.printStackTrace(); 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 

      Sheet eventCauseTableSheet = wb.getSheetAt(1); 

      for (int i = 1; i <= eventCauseTableSheet.getLastRowNum(); i++) { 
       System.out.println("Importing EcentCauseSheet"); 

       row = eventCauseTableSheet.getRow(i);          
       int causeCode = (int)(row.getCell(0).getNumericCellValue());           
       int eventId = (int)(row.getCell(1).getNumericCellValue());      
       String description = row.getCell(2).toString(); 

       System.out.println("Cause Code is " + causeCode); 
       System.out.println("Event Id " + eventId);    
       System.out.println("Description is " + description); 

       EventCauseTable eventCauseTable = new EventCauseTable(causeCode,eventId,description);    
       em.persist(eventCauseTable); 
       System.out.println("Persisted EventCauseSheet row" + (i+1)); 

      } 

//............ 
+2

finally 블록의 모든 코드는 try 블록에 있어야합니다. 그리고 예외를 무시해서는 안됩니다. 또한 EJB 확장 스레드는 심각한 디자인 냄새처럼 보입니다. –

+0

안녕하세요 - 그래서 문제가 될 수 있습니다 – user1438082

+1

실제 문제는 catch (예외) {} 블록에 의해 숨겨져 있습니다. 실제 예외가 기록되도록 의미있는 오류 메시지와 함께 제거하여 시작하십시오. 그리고 이것이 예외가 발생하는 곳이기 때문에 어떤 줄이 131 줄인지 알려주십시오. –

답변

0

는, 일반적으로 나쁜 생각 언제든지. 클러스터링과 SFSB 복제에 대해서도 생각해 볼 수 있습니다. EJB가 다른 머신에 직렬화 될 수 있으며 Thread가 실제로 적용되지 않습니다 (Serializable이 아님).

NullPointerException이 em.persists (...)에서 발생하면 "em"참조가 누락됩니다. EntryConfig 인스턴스에 @ EntityManager를 삽입하려고합니다. 컨테이너에 의해 관리되지는 않습니다. EntityManager를 수동으로 설정해야하는 것보다 컨테이너 외부에서이 클래스를 다시 사용하려는 경우 (첫 번째 부분은 계속해서 적용됩니다. 전체 구성 요소를 재 설계해야 할 것입니다).

관련 문제