2013-03-24 47 views
0

我有一個方法loadDatabase()。該方法本身工作完美。在單獨的線程中調用方法會導致NullPointerException

當我創建一個單獨的線程並調用方法loadDatabase()我得到如下所示的錯誤。 在主線程上,它工作正常。

任何想法? 注意:因爲我已將它們打印到屏幕,所以值causecode,eventid和description不爲空。

錯誤

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) 

Java代碼類

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

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

Java代碼線程

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

     } 

公佈IC無效的HelloWorld() {

try { 
     loadDatabase();   

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

} 

Java代碼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擴展線程看起來像是一種嚴肅的設計氣味。 – 2013-03-24 16:17:11

+0

嗨 - 那麼可能是什麼問題 – user1438082 2013-03-24 16:20:57

+1

真正的問題可能是你的catch(Exception){}塊隱藏的。開始刪除它,以便記錄真正的異常,並附帶有意義的錯誤消息。並告訴我們哪一行是第131行,因爲這是發生異常的地方。 – 2013-03-24 16:22:59

回答

0

在有狀態EJB擴展一個線程通常是一個壞主意,因爲它可能是passivated由容器隨時。你也可以考慮集羣和SFSB複製 - 你的EJB可能會被序列化到另一臺機器上,而線程並不適用於此(它不是Serializable)。

如果你的NullPointerException拋出em.persists(...),那麼你錯過了「em」引用。最有可能的是,您正試圖@將一個EntityManager注入到一個EntryConfig實例中,該實例不受容器管理。如果你想在容器外部重用這個類,你需要手動設置EntityManager(第一部分仍然適用 - 你應該重新設計整個組件)。

相關問題