2015-08-24 2 views
1

Я пишу приложение для Android и столкнулся с очень странной ошибкой, с которой я не могу окутать голову. В приведенном ниже коде переменная «результат» заполняется значениями в зависимости от разных условий. Затем он должен быть возвращен. В отладчике можно увидеть, что значение для результата установлено правильно. Однако при достижении оператора return (в этот момент результат имеет правильное значение в соответствии с отладчиком), метод возвращает null вместо значения в результате. Я также пробовал очистить проект и скомпилировать код на другой машине с теми же результатами. Я не могу представить, что здесь не так, но мне кажется, что во время процесса компиляции что-то пошло не так.Оператор возврата возвращает значение null вместо заданного значения

Я использую 64-битную jdk1.7.0_79 на Windows 10 машины и запуска кода на Nexus 7 (2012) Эмулятор с Android Studio Версия 1.3.1

Большое спасибо за вашу помощь в авансовый.

private static WikiItemContainer getMappingForIntermediateThrowEvent(IntermediateThrowEvent intermediateThrowEvent, List<WikiItemContainer> eventContainers) { 
    WikiItemContainer result = null; 
    List<EventDefinition> eventDefinitions = intermediateThrowEvent.getEventDefinitions(); 
    if (eventDefinitions.isEmpty()) { 
     result = new WikiItemContainer(eventContainers.get(0).getItems().get(1)); 
    } else if (eventDefinitions.size() > 1) { 
     result = new WikiItemContainer(eventContainers.get(10).getItems().get(6)); 
    } else { 
     EventDefinition definition = eventDefinitions.get(0); 
     if (definition instanceof MessageEventDefinition) { 
      result = new WikiItemContainer(eventContainers.get(1).getItems().get(6)); 
     } else if (definition instanceof EscalationEventDefinition) { 
      result = new WikiItemContainer(eventContainers.get(3).getItems().get(4)); 
     } else if (definition instanceof LinkEventDefinition) { 
      result = new WikiItemContainer(eventContainers.get(5).getItems().get(1)); 
     } else if (definition instanceof CompensateEventDefinition) { 
      result = new WikiItemContainer(eventContainers.get(8).getItems().get(2)); 
     } else if (definition instanceof SignalEventDefinition) { 
      result = new WikiItemContainer(eventContainers.get(9).getItems().get(6)); 
     } 
    } 
    return result; 
} 
+0

Что такое особый класс 'definition', когда возвращается нуль? Вероятно, это событие EventDefinition, которое не обрабатывается в операторах if. –

+0

Пробовал ли вы регистрировать, является ли результат нулевым перед оператором return? –

+0

Да, это объект типа WikiItemContainer, как и следовало ожидать, и как показывает отладчик. –

ответ

1

Существует одно условие, где result равно нулю:

private static WikiItemContainer getMappingForIntermediateThrowEvent(IntermediateThrowEvent intermediateThrowEvent, List<WikiItemContainer> eventContainers) { 
    WikiItemContainer result = null; 
    List<EventDefinition> eventDefinitions = intermediateThrowEvent.getEventDefinitions(); 
    if (eventDefinitions.isEmpty()) { 
     result = new WikiItemContainer(eventContainers.get(0).getItems().get(1)); 
    } else if (eventDefinitions.size() > 1) { 
     result = new WikiItemContainer(eventContainers.get(10).getItems().get(6)); 
    } else { 
     EventDefinition definition = eventDefinitions.get(0); 
     if (definition instanceof MessageEventDefinition) { 
      result = new WikiItemContainer(eventContainers.get(1).getItems().get(6)); 
     } else if (definition instanceof EscalationEventDefinition) { 
      result = new WikiItemContainer(eventContainers.get(3).getItems().get(4)); 
     } else if (definition instanceof LinkEventDefinition) { 
      result = new WikiItemContainer(eventContainers.get(5).getItems().get(1)); 
     } else if (definition instanceof CompensateEventDefinition) { 
      result = new WikiItemContainer(eventContainers.get(8).getItems().get(2)); 
     } else if (definition instanceof SignalEventDefinition) { 
      result = new WikiItemContainer(eventContainers.get(9).getItems().get(6)); 
     } 


     // What value will result have here if none of the if statements above are entered? 

    } 
    return result; 
} 
+0

Конечно, но в моем случае результат имеет правильное значение непосредственно перед оператором return, однако возвращает null в любом случае. Вот что оставляет меня озадаченным. –

+0

Это невозможно. Во всех подобных случаях разработчик допустил ошибку - либо глядя на неверную переменную, либо на неверную нить, либо на что-то другое. Код никогда не лежит! – adelphus

+0

Я думал так же, но может быть небольшой шанс, что в компиляторе/эмуляторе есть какая-то действительно странная ошибка, поскольку я не могу понять, почему возврат игнорирует реальное значение во время выполнения (что похоже на настройку согласно протоколу вывода/отладчика). –

0

Пробовали ли вы войти определение? Попробуйте

Log.v("xxxx","definition:."+definition.getClass().Name()); 

Срубы размер списка eventDefinition

Log.v("xxxx","event definition size: "+eventDefinition.size()); 
+0

Ошибка возникает в модульном тесте, где eventDefinitions намеренно пуст, поэтому определение никогда не инициализируется, и список пуст, как ожидалось. –

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