在签名为 return int 的方法中返回 null?
Posted
技术标签:
【中文标题】在签名为 return int 的方法中返回 null?【英文标题】:Returning null in a method whose signature says return int? 【发布时间】:2013-06-17 18:56:19 【问题描述】:public int pollDecrementHigherKey(int x)
int savedKey, savedValue;
if (this.higherKey(x) == null)
return null; // COMPILE-TIME ERROR
else if (this.get(this.higherKey(x)) > 1)
savedKey = this.higherKey(x);
savedValue = this.get(this.higherKey(x)) - 1;
this.remove(savedKey);
this.put(savedKey, savedValue);
return savedKey;
else
savedKey = this.higherKey(x);
this.remove(savedKey);
return savedKey;
该方法位于作为 TreeMap 扩展的类中,如果这有什么不同的话……有什么想法为什么我不能在这里返回 null 吗?
【问题讨论】:
因为null
不是int
?
是什么语言?请添加更多标签。 Afaik 只有 void 函数可以返回 null,否则需要返回 0 或 -1。尝试“return void;”,具体取决于语言
Russel,这取决于语言,无论如何,请将答案作为答案发布,以便我们可以向任何我们想要的方向投票。
作为一种解决方法,您可以定义一个合同,通过该合同您返回 Integer.MIN_VALUE 或 Integer.MAX_VALUE 表示“无”或“无效值”...假设 MIN_VALUE 或 MAX_VALUE 否则永远不会返回.
【参考方案1】:
int
类型是原语,不能是null
,如果要返回null
,把签名标记为
public Integer pollDecrementHigherKey(int x)
x = 10;
if (condition)
return x; // This is auto-boxing, x will be automatically converted to Integer
else if (condition2)
return null; // Integer inherits from Object, so it's valid to return null
else
return new Integer(x); // Create an Integer from the int and then return
return 5; // Also will be autoboxed and converted into Integer
【讨论】:
else ... else
真的吗? :D【参考方案2】:
将您的返回类型更改为 java.lang.Integer 。这样你就可以安全地返回 null
【讨论】:
【参考方案3】:int
是一个原语,null 不是它可以采用的值。您可以将方法返回类型更改为返回 java.lang.Integer
,然后您可以返回 null,并且返回 int 的现有代码将自动装箱。
空值只分配给引用类型,这意味着引用不指向任何东西。基元不是引用类型,它们是值,因此它们永远不会设置为 null。
使用对象包装器 java.lang.Integer 作为返回值意味着您正在传回一个 Object 并且对象引用可以为 null。
【讨论】:
你假设什么语言? @Jeppe:我猜是 C# 或 Java。它们都有原语、对象包装器和自动装箱。【参考方案4】:你真的要返回 null 吗?您可以做的事情可能是用 0 值初始化 savedkey 并将 0 作为空值返回。它可以更简单。
【讨论】:
我们从给定的代码中知道的不多,但是 0 可能是一个合法的返回值。但是,您认为返回一些无效的结果来表示失败是一个很好的想法。 这不好,因为java为这种情况实现了异常。【参考方案5】:int
是原始数据类型。它不是可以采用 null
值的参考变量。您需要将方法返回类型更改为Integer
包装类。
【讨论】:
以上是关于在签名为 return int 的方法中返回 null?的主要内容,如果未能解决你的问题,请参考以下文章