Ответ 1
Проблема заключается в том, что int
и long
являются примитивами. Вы не можете передать null
в примитивное значение.
В вашей сигнатуре метода вы можете использовать классы-оболочки Integer
и long
вместо long
и int
.
Может быть, глупый вопрос, но как передать null
методу, который принимает long
или int
?
Пример:
TestClass{
public void iTakeLong(long id);
public void iTakeInt(int id);
}
теперь, как я могу передать значение null методам:
TestClass testClass = new TestClass();
testClass.iTakeLong(null); // Compilation error : expected long, got null
testClass.iTakeInt(null); // Compilation error : expected int, got null
Мысли, предложения?
Проблема заключается в том, что int
и long
являются примитивами. Вы не можете передать null
в примитивное значение.
В вашей сигнатуре метода вы можете использовать классы-оболочки Integer
и long
вместо long
и int
.
Вы не можете - нет такого значения. Если вы можете изменить подпись метода, вы можете заставить его вместо этого использовать ссылочный тип. Java предоставляет неизменяемый класс "wrapper" для каждого примитивного класса:
class TestClass {
public void iTakeLong(Long id);
public void iTakeInt(Integer id);
}
Теперь вы можете передать нулевую ссылку или ссылку на экземпляр типа обертки. Автобоксинг позволит вам написать:
iTakeInt(5);
Внутри метода вы можете написать:
if (id != null) {
doSomethingWith(id.intValue());
}
или используйте автоматическую распаковку:
if (id != null) {
doSomethingWith(id); // Equivalent to the code above
}
Вы можете присвоить null классу-не-примитиву, который будет компилироваться.
TestClass testClass = new TestClass();
testClass.iTakeLong( (Long)null); // Compiles
testClass.iTakeInt( (Integer)null); // Compiles
Но при выполнении будет выбрано NullPointerException
. Не очень помогает, но полезно знать, что вы можете передать оболочку, эквивалентную методу, который принимает примитив как аргумент.
В зависимости от того, сколько у вас таких методов и сколько звонков у вас есть другой выбор.
Вместо распределения нулевых проверок на всей вашей кодовой базе вы можете писать методы-оболочки (N.B., а не обертки типа (int = > Integer), но методы, которые обертывают ваши):
public void iTakeLong(Long val) {
if (val == null) {
// Do whatever is appropriate here... throwing an exception would work
} else {
iTakeLong(val.longValue());
}
}
Используйте классы Wrapper:
TestClass{
public void iTakeLong(Long id);
public void iTakeInt(Integer id);
public void iTakeLong(long id);
public void iTakeInt(int id);
}
Вы не можете этого сделать. Примитивные типы не могут быть null
в Java.
Если вы хотите передать null
, вы должны изменить свою подпись метода на
public void iTakeLong(Long id);
public void iTakeInt(Integer id);
Указание значения на Long
, как показано ниже, приведет к исчезновению ошибки компиляции, но в конечном итоге окажется в NullPointerException
.
testClass.iTakeLong((Long)null)
Одним из решений является использование типа Long
вместо примитива Long
.
public void iTakeLong(Long param) { }
Другим решением является использование org.apache.commons.lang3.math.NumberUtils
testClass.iTakeLong(NumberUtils.toLong(null))