繁体   English   中英

java句柄返回异常

[英]java handle return exception

以下代码应该返回arraylist中的最后一个值,如果它有一个,如果没有,我怎么能返回异常?

public int getLast() {
        try {
            return arrl.get(arrl.size() - 1);
        } catch (Exception e) {
            System.out.println("Caught "+ e);
        }
    }

这里的arrl是ArrayList

我执行了上面的代码并收到“错误:缺少返回声明”

你在try{}有return语句,但在catch(){}却没有,这给你一个例外。 您可以在两者中包含退货或在try catch之后返回。

public int getLast() {
        Object o=null;
       try {
            o=arrl.get(arrl.size() - 1);
        } catch (Exception e) {
            System.out.println("Caught "+ e);
        }
       return o;
    }

另外,要将异常返回给调用者,您需要从方法中重新抛出它,或者根本不捕获它

catch (Exception e) {
                System.out.println("Caught "+ e);
                throw e;
            }

要么

 public int getLast() {
                return arrl.get(arrl.size() - 1);
        }

但我怀疑除了IndexOutOfBoundsException之外, IndexOutOfBoundsException从此语句中抛出任何异常

你没有返回异常..你把它扔回调用者。

public int getLast() {
    try {
        return arrl.get(arrl.size() - 1);
    } catch (Exception e) {
        System.out.println("Caught "+ e);
        throw e;
    }
}

您的代码会给您编译错误,因为您没有在catch块中返回任何内容。 投掷会很好。

或者,不要捕获它,任何未捕获的异常将自动返回给调用者。 所以下面的代码也会将异常抛回到调用方法。

public int getLast() throws Exception {
        return arrl.get(arrl.size() - 1);
}

这里的try/catch块确实没有充分的理由。 只需将NPE或AIOOBE抛给调用者并让他处理它们。

您收到此错误,因为如果try -part中的第一个return不起作用,则编译器不知道应该返回什么。 您需要在catch -part中进行另一次return或异常重新抛出:

public int getLast() {
    try {
        return arrl.get(arrl.size() - 1);
    } catch (Exception e) {
        System.out.println("Caught "+ e);
        // You need to return something here or rethrow the e...
    }
   // or return something here.
}

......但是这种逻辑无论如何都是坏的,这个函数根本不应该抛出异常。 在获取最后一个之前,我最好检查一下数组是否有任何项目。 如果在循环中运行它,如果经常抛出错误,性能可能会非常糟糕。

public int getLast() {
    if (arrl != null && arrl.size() > 0) {
        return arrl.get(arrl.size() - 1);
    } 
    else {
        return -1;
    }
}

要么

public Integer getLast() {
    if (arrl != null && arrl.size() > 0) {
        return arrl.get(arrl.size() - 1);
    } 
    else {
        return null;
    }
}

在这种情况下,可能引发的唯一异常是NPE,因为arrl为null,如果列表为空则为索引错误。 如果该类正确初始化,则NPE根本不应发生。 另一个例外是客户端错误,可能会传递给调用者。 或者,可以考虑返回null(在将int更改为Integer之后):

public Integer getLast() {
    try {
        return arrl.get(arrl.size() - 1);
    } catch (IndexOutOfBoundsException ioobe) {
        return null;
    }
}

您的方法可能无法返回值(出于什么原因)。 在这种情况下,您应该使用java.lang.Optional(Java-8)作为返回类型:

 public Optional<Integer> getLast() {
    try {
        return Optional<T>.ofNullable(arrl.get(arrl.size() - 1));
    } catch (Exception e) {
        e.printStackTrace();
        return Optional.empty();
        }
 }

这样,您将强制方法的用户处理没有返回结果的情况。 (顺便说一句:你不应该捕获异常,大多数情况下都不会。请注意arrl不为null且arrl.size()在限制范围内。处理异常是针对... umm例外情况,不能用作控制语句。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM