繁体   English   中英

Java 异常的返回类型是什么?

[英]What is the return type of a Java exception?

我正在编写一个计算器练习,它需要一个 int 数组来进行加法、减法、除法和乘法运算。 我需要检查数组不是 null 的每种方法。 与其重复自己,我可以编写一次 throwException 方法,然后在我的方法中调用它吗? 例如加法

public int addAll(int[] integers) {
    throwExceptionForNullArray();
    int sumOfAllIntegers = 0;
    for (int integer : integers) {
        sumOfAllIntegers += integer;
    }
    return  sumOfAllIntegers;
}

public throwExceptionForNullArray (int[] integers){
    if (integers == null){
        throw new IllegalArgumentException("Empty array is not allowed");
    }
}

但是 Java 在方法中需要返回类型,你有什么想法可以让 throwExceptionForNullArray 方法工作吗? 返回类型应该是什么? 谢谢

Java 异常的返回类型是什么?

这就像是在问:“厌倦的颜色是什么?” - 这个问题没有意义。

让我换一种说法。 想象一下这个假设的方法:

public int hello() {
  while (true) {
    // just loop forever and ever and ever.
  }
}

以上将...实际编译。 试试看!

这有点奇怪 - 这个方法被声明为返回一个 int,然而,该方法根本不包含return语句 然而这编译得很好。 那是因为它的“工作方式”有点不稳定。 它实际上从未退出,因此这里没有违反规则。 int的返回类型意味着:如果该方法正常返回,它必须通过返回一个int值来实现。

请注意,如果它正常返回。 没有规则规定所有方法必须总是正常返回,或者它甚至可以正常返回。 比如上面的方法不能正常返回。

当您的方法遇到return语句或刚刚到达右大括号时,就会发生“正常”返回。

throw 语句是一种异常情况。 通过 throwing 退出的方法不会返回任何内容 它是扔出去的。 这并不意味着它“返回”了异常。 这意味着它“抛出”了异常。

一个不可能正常返回的方法(如果通过该方法的所有方式都以throw语句结束,则它不可能正常返回)可以选择任何它想要的返回类型。 没关系。 什么都会做。 对于声明目的为的方法:

  • 如果输入有效,则绝对什么也不做
  • 否则,抛出异常,突出显示输入的无效内容

通常的返回类型是void 所以,这样做:

public void checkInput(int[] integers) {
    if (integers == null) {
        throw new NullPointerException("integers");
    }
}

几点注意事项:

  • 你的信息是大错特错。 null并不意味着“空”,一个非常重要的区别。 new int[0]是一个空数组。 null是 null 指针。 不要把两者混为一谈。 可能有一个方法不喜欢空数组的输入。 在这种情况下,正确的做法是:
if (integers.length == 0) throw new IllegalArgumentException("Empty 'integers' array not allowed");

将 NullPointerException 用于参数为 null 更合适,因为它们不应该作为先决条件。

  • 如果您要取消引用参数,则实际上没有必要这样做。 JVM 本身会为您抛出 NPE,甚至假设您使用的是现代 JVM 来命名它。 您取消引用integersfor (int i: integers)将这样做),因此您可以将其全部删除并获得相同的结果,即:使用null调用该方法将引发一个 NPE,其消息包含文本“整数”。
  • 将方法命名为“throwExceptionFor”有点过分,它描述了太多它是如何工作的,而不足以描述它应该做什么。 checkInput描述了为什么/什么而不是如何,这通常是命名方法的更好方法。

问题由 rzwitserloot 回答,使用void返回类型。 还有其他方法可以解决这个问题。

JVM 为您处理NullPointerException 另请查看java.util.Objects提供的调用,这些调用可用于提供增强的错误报告:

Objects.requireNonNull(integers, "Arg integers is not set");
Objects.requireNonNull(someField, "Member someField is not set, perhaps missing somecall() ?");

还有一些方便的调用可以接受供应商,因此如果不使用 arguments 可以更复杂而没有运行时创建开销:

Objects.requireNonNull(someField, () -> "Member someField is not set for "+this);

您还可以修复空值以使用默认值,使用供应商变体意味着仅在需要时构造默认值:

integers = requireNonNullElse(integers, someDefault);
integers = requireNonNullElseGet(integers, () -> new int[0]);

暂无
暂无

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

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