2013-03-24 2 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 выглядит как серьезный запах дизайна. –

+0

привет - так что может быть проблемой – user1438082

+1

Реальная проблема, вероятно, скрыта блоком catch (Exception) {}. Начните с удаления его, чтобы реальное исключение регистрировалось со значимым сообщением об ошибке. И скажите нам, какая строка - строка 131, так как здесь происходит исключение. –

ответ

0

Расширения темы в отслеживании состояния EJB, как правило, плохая идея, так как это может быть passivated контейнером в любое время. Вы также можете подумать о кластеризации и репликации SFSB - ваш EJB может быть сериализован на другую машину, а Thread для этого не применим (это не Serializable).

Если ваше исключение NullPointerException выбрано em.persists (...), вам не будет указана ссылка «em». Скорее всего, вы пытаетесь @Inject EntityManager в экземпляр EntryConfig, который не управляется контейнером. Если вы хотите повторно использовать этот класс вне контейнера, вам нужно будет вручную установить EntityManager (первая часть по-прежнему применяется жестко - вы, вероятно, должны перепроектировать весь компонент).

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