首页 文章

在应该返回整数的函数中返回null

提问于
浏览
3

代码标识数组中最接近0的整数,如果有2个或更多值满足此条件,则返回值应为null . 问题是当我使条件返回null时,它会显示错误,因为函数应该返回一个整数 .

static int function(int [] arr){
    int closest=arr[0];
    for(int i=1;i<arr.length;i++){
        if(Math.abs(arr[i])<closest){
            arr[i]=closest;
        }
        else if(arr[i]==closest){
            return null;
        }
    }
    return closest;
}

我是Java的新手(以前学过Python),如果有更好/更有效的方法来解决这个问题请分享 .

3 回答

  • 3

    显而易见的答案是返回 Integer 而不是 int .

    static Integer function(int[] arr) {
    

    Autoboxing将负责包装原语; autounboxing将负责为您的客户提供代码 NullPointerException .

    但是你说效率很高,但是分配一个真正的对象效率不高(小值将使用一个共同的对象,但仍然不是很好) . 抛出异常的效率会更低(假设它经常发生 . )

    例程可能返回任何 int 值,我们想要推出额外可能的outcode . 因此,有一种可能性是将一个更大并返回 long ,并将 Long.MIN_VALUE 作为特殊值 . 可能需要在客户端代码上进行强制转换才能返回 int .

    static Integer function(int[] arr) {
    

    Long.MIN_VALUE 很有意思 Long.MIN_VALUE == Math.abs(Long.MIN_VALUE) .

    在这一点上,我们意识到代码中似乎存在一个错误(不确定,因为我真的知道它应该做什么) .

    if(Math.abs(arr[i])<closest){
    

    Integer.MIN_VALUE 始终如此 . 可能你想换掉它 .

    if (-Math.abs(arr[i]) > -closest){
    

    在进行比较之前转换为 long 也是可能的,但不那么聪明 . (整数溢出 - bleurgh . )

    绕过这个问题的另一种方法是让客户端代码选择一个合适的值来发出相同的信号,就像 null 应该指示的那样 .

    static int function(int[] arr, int dflt) {
        [...]
            } else if (arr[i] == closest) {
                return dflt;
            [...]
    
  • 2

    如果你需要支持 null (例如Python的 None ),那么你应该返回包装类型 Integer .

    static Integer function(int [] arr) {
        // ...
    }
    
  • 3

    您可以将返回类型转换为 Integer ,它可以容纳 null 并自动将box和unbox转换为int:

    static Integer function(int [] arr){
        int closest=arr[0];
        for(int i=1;i<arr.length;i++){
            if(Math.abs(arr[i])<closest){
                arr[i]=closest;
            }
            else if(arr[i]==closest){
                return null;
            }
        }
        return closest;
    }
    

    然而,这可能不是最好的解决方案 . 您可以改为返回 Integer.MAX_VALUE 来表示两个元素从零开始等距离 . 这取决于你计划如何处理有两个与 0 距离相等的元素的情况 .

相关问题