在签名为 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?的主要内容,如果未能解决你的问题,请参考以下文章

Java 中无参带返回值方法的使用

可以在不同的方法上将变量命名为相同的名称吗?

为啥 int main() 编译?

VB.NET中“FunctionName = value”和“Return value”的区别?

正确理解Java方法的返回值

能把QVector < int >作return的返回值