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 - 即 RuntimeException
、Error
或它们的后代。
对于以下方法,当它不在 '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
.
... is it okay to throw the exception when it isn't inside a 'try' block?
当然1是!
确实...这是抛出异常的最常见方式。
确实 2 ... 如果我们不使用这样的异常,它们将(几乎)是多余的,因为我们(几乎)可以用 "break to label" 替换它们和一个局部变量来保存异常信息.
1 - 假设异常未被检查2,或者你在方法签名中声明它。
2 - 即 RuntimeException
、Error
或它们的后代。