Java,使用没有 try 块的 throw

Java, using throw without try block

对于以下方法,当它不在 'try' 块内时可以抛出异常吗?

public void setCapacity(x) throws CapacityExceededException {
    if (x > 10) throw new CapacityExceededException(x);
    else this.x = x;
}

只需添加一个throws声明:

public int getCapacity() throws CapacityExceededException {
    // Something goes here
}

否则,您将收到编译器警告。这将获取抛出异常的方法。但是,无论何时执行该方法,都必须使用 try 块。这是因为执行该方法可能会抛出异常。

try {
    getCapacity()
} catch (CapacityExceededException e) {
    // Do Something
}

是的,当它不在 try 块内时抛出异常是可以的。您所要做的就是声明您的方法抛出异常。否则编译器会报错。

public void setCapacity(x) throws CapacityExceededException {
    if (x > 10) throw new CapacityExceededException(x);
    else this.x = x;
}

如果您的 CapacityExceededException 扩展了运行时异常,您甚至不必这样做。

public void setA(int a) {
            this.a = a;
            if(a<0) throw new NullPointerException();
        }

此代码不会给出任何编译器错误。由于 NPE 是一个 RuntimeException。

当您抛出异常时,异常将传播到调用 setCapacity() 方法的方法。该方法必须通过 try catch 处理异常,或通过重新抛出将其传播到调用堆栈中。

是的,没关系。您只需为方法添加 throws 子句,以防它抛出已检查的异常。抛出异常的 try 子句没有限制。例如,如果您有一个堆栈并调用了 pop() 方法并且大小为零,您可以检查它并抛出异常。您可能需要在计划调用此方法的任何地方捕获异常。否则这个未捕获的异常将向上移动调用堆栈并最终由 JVM 处理,它将在 System.err 流上打印堆栈跟踪。如果需要,我们还可以指定自己的处理程序:

public class CustomUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
  public void uncaughtException(Thread t, Throwable e) {
     // Write the custom logic here
   }
}

如果是 RunTimException.

,你甚至不需要在 throws 中提及异常

... is it okay to throw the exception when it isn't inside a 'try' block?

当然1是!

确实...这是抛出异常的最常见方式。

确实 2 ... 如果我们不使用这样的异常,它们将(几乎)是多余的,因为我们(几乎)可以用 "break to label" 替换它们和一个局部变量来保存异常信息.


1 - 假设异常未被检查2,或者你在方法签名中声明它。

2 - 即 RuntimeExceptionError 或它们的后代。