2017-02-07 1 views
1

Я испытываю странное поведение с использованием java-метода внутри класса EJB.Целочисленный объект правильно создан внутри метода, но возвращается null

У меня есть несколько Integer, заявил следующее:

Integer decimalDigit = null; 
Integer decimalExponent = null; 

я передать их следующим способом, наряду с другими параметрами.

public void GetPrecision(Currency cur, String nodeCode, Integer decimalDigit, Integer decimalExponent) { 

    decimalDigit = new Integer(cur.getDecimalDigit()); 
    decimalExponent = new Integer(cur.getDecimalExponent()); 

    if (!CommonHelper.isNullOrEmptyOrBlank(nodeCode)) { 

     Node tempNode = nodeListProvider.getNodeList().get(nodeCode); 

     if (tempNode != null && tempNode.getDecimalDigit() != null) { 
      decimalDigit = (int) tempNode.getDecimalDigit(); 
      decimalExponent = 0; 
     } 
    } 
} 

В 2 объекта правильно istantiated внутри метода с использованием нового оператора, и они остаются так до конца вызова, но, как только я выйти, то 2 переменные снова нуль.

Я не могу объяснить это поведение, любой намек?

Заранее спасибо

+1

Java передается по значению. Изменения, внесенные в переданный фактический параметр, не сохраняются при выходе метода. –

+1

Возможный дубликат [Является ли Java «передачей по ссылке» или «передачей по значению»?] (Http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass -by-value) – Deltharis

ответ

1

аргументы передаются по значению, но метод получает копию ссылки, а не непосредственно в ссылках вашего Integer.
Таким образом, любая привязка параметров внутри метода не изменит значение, на которое ссылаются ссылки, которые вы передали.

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

Кроме того, ожидается, что метод под названием GetPrecision() что-то вернет.

+0

mmm, я точно не понимаю разницу между передачей 2 Integer и передачей пользовательского класса, который содержит 2 Integer. Разве обе они не являются объектами? – rekotc

+0

Нет. Я сказал, что ваш метод должен что-то вернуть: либо массив 'Integer []', содержащий новые значения decimalDigit и decimalExponent, либо пользовательский класс, который содержит два поля Integer. – davidxxx

+0

Хорошо, но я попытался создать класс foo, содержащий 2 целых числа, я передаю этот объект foo в качестве аргумента, и он работает правильно, 2 значения Integer по-прежнему не имеют значения null после завершения метода. Поэтому я не понимаю разницы между настраиваемым объектом, переданным в качестве аргумента, и объектом Integer, который я использовал в первом примере. – rekotc

0

если cur.getDecimalDigit() и cur.getDecimalExponent() и дали null, decimalDigit и decimalExponent по-прежнему будут иметь значение null для любого последующего значения set.so проверьте значения cur.getDecimalDigit() и cur.getDecimalExponent().

0

Вы имеете в виду локальных переменных, объем которых заканчивается методом с этими линиями:

decimalDigit = new Integer(cur.getDecimalDigit()); 
decimalExponent = new Integer(cur.getDecimalExponent()); 

, потому что вы объявили их в качестве формальных параметров.

Перепишите метод как таковой, чтобы решить вопрос:

public void GetPrecision(Currency cur, String nodeCode, Integer a, Integer b) { 

//method body 

} 

Это плохая практика, чтобы использовать идентификаторы, как a и b, но вы получите эту проблему.

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