2015-08-30 4 views
1

я мог бы быть неправильно, о которых линия является причиной проблемы, но ошибка меняется каждый раз, я изменить это, если() заявление:Почему мое приложение Java убивается?

try { 
    while(true) { 
     String LRU = hashOperation(); 
     System.out.println("In worker thread, this should be valid JSON: " + LRU); 
     if (jsonValidator.isStringValidJSON(LRU) && !LRU.isEmpty()) { 
       HashMap<String,String> messageMap = jsonGenerator.readJSON(LRU); 

Так я предполагаю, что проблема с этим, если() заявление. Если я пишу это так:

if (jsonValidator.isStringValidJSON(LRU)) { 

Затем приложение запускается и я получаю это исключение:

In worker thread, this should be valid JSON: 
Exception in worker thread in Main::main: No content to map to Object due to end of input 

, но если я пишу это так:

if (jsonValidator.isStringValidJSON(LRU) && !LRU.isEmpty()) { 

Затем приложение запускается, но затем почти мгновенно умирает:

/usr/bin/java -cp /home/jenkins/run-nlp/SSAM.jar com.sofar.SSAM.Main 
Starting NLP app 2015/08/30 21:42:28 

Loading classifier from dependencies/english.all.7class.distsim.crf.ser.gz ... Killed 

Основная идея здесь заключается в том, что приложение запускается, а затем закручивает некоторые фоновые потоки, которые бесконечно опросу на Redis, ища вход (вход поступает из другого приложения, которое публикует данные на канал в Redis).

Когда я вижу «Убитые» Я полагаю, что Exception пошел неперехваченное, но я всю эту тему :: Run(), завернутый в Try/улова, которая заканчивается:

} catch (Exception e) { 
    System.out.println("Exception in worker thread in Main::main: " + e.getMessage()); 
} 

Вы можете увидеть, что это сообщение Exception, что я получу, если я это сделать:

if (jsonValidator.isStringValidJSON(LRU)) { 

Хотя возможно ошибка в другом месте, и я думаю, что это странно, что пустая строка будет действительным JSON, я думал, что отсеивать эта возможность с:

if (jsonValidator.isStringValidJSON(LRU) && !LRU.isEmpty()) { 

Почему это одно изменение заставляет мое приложение быть убитым?

UPDATE:

Я реструктурировать приложение к этому:

static void processMessage(ssamBrain ssamBrain, Jedis jedis, HashMap<String, String> responseMap, JsonGenerator jsonGenerator, JSONValidator jsonValidator, String LRU) { 
try { 
     if (!LRU.isEmpty()) { 
      HashMap<String,String> messageMap = jsonGenerator.readJSON(LRU); 
      Transformer transformer = new Transformer(); 

Опять же, линия, которая вызывает проблемы, кажется:

 if (!LRU.isEmpty()) { 

Если у меня нет, что if(), то код получает:

java.io.EOFException: No content to map to Object due to end of input 

на следующей строке, так как пустая строка недействительна JSON.

Но когда я добавить:

 if (!LRU.isEmpty()) { 

Затем мое приложение умирает при запуске.

Возможно автобоксирование является проблемой? Или его отсутствие? Предположим на данный момент:

LRU = "";

Я предполагаю, что могу называть методы на нем, но, возможно, нет? И почему бы мне не получить исключение?

Возможно, проблема в другом месте, но если утверждение() кажется основным, это вызывает проблему.

UPDATE

UPDATE

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

1.) когда приложение Java говорит «Убито» в терминале, всегда ли это означает, что Исключение сменилось?

2.) что может вызвать такое поведение переменных?

+3

Вместо того, чтобы печатать 'e.getMessage()', используйте просто 'e.printStackTrace();' - это даст вам больше информации для работы. –

+0

Это может быть полезно http://stackoverflow.com/questions/19775704/rest-post-controller-saying-could-not-read-json-no-content-to-map-due-to-end-o –

+0

Luis Сиейра, я был бы счастлив, если бы смог получить Исключение. Прямо сейчас я просто получаю «Killed» после запуска приложения. – lars

ответ

0

Как работает, если оператор:

if (CONDITION_1 && CONDITION_2){ 
doSomething(); 
} 
  1. проверяет Condition_1 - если это правда:
  2. проверяет CONDITION_2 - если это правда:
  3. работает doSometring().

Если CONDITION_1 является ложным или выбрасывает исключение, CONDITION_2 никогда не проверяет.

  1. Пожалуйста, показать исключение stackTrace.
  2. Изменение:

    if (jsonValidator.isStringValidJSON(LRU) && !LRU.isEmpty()) 
    

к:

if (!LRU.isEmpty() && jsonValidator.isStringValidJSON(LRU)) 

Итак, сначала проверить, если LRU пуст, и если это не так - вы запустите проверку.

+0

Ну, я попытался реорганизовать более мелкие методы, и теперь приложение «Killed» при запуске, поэтому я не могу получить никаких Исключений или трассировок стека. Если я смогу получить их, я отправлю их. – lars

+0

Кажется, что пустая строка проходит тест validJson, но я попробую. – lars

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