[英]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 更合适,因为它们不应该作为先决条件。
integers
( for (int i: integers)
将这样做),因此您可以将其全部删除并获得相同的结果,即:使用null
调用该方法将引发一个 NPE,其消息包含文本“整数”。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.