我可以在单个 class 文件中的 java 中定义多个自定义异常并通过方法调用它们吗?
Can I define multiple custom exceptions in java in a single class file and invoke them via methods?
我正在尝试通过自定义异常处理异常。
我正在创建 class CustomExceptions 并按如下方式扩展异常:
public class CustomExceptions extends Exception{
public CustomExceptions (String s) {
super(s);
}
但是,我不想为我想要的每个自定义异常创建多个文件,也不想使我的主 class 文件膨胀,我想将所有自定义异常放在这个 class 中并通过方法调用它们
假设我要处理两种情况:当用户尝试输入座位预订但座位已被占用时,以及当用户尝试为年龄范围以外的人提供机票时。
我可以在 CustomExceptions class 中创建 2 个方法来调用向其传递自定义消息的构造函数吗?
public void seatTaken(String s) {
String s = "The seat is taken, please choose a new one";
CustomExceptions(s);
}
public void notOldEnough(String s) {
String s = "User is not old enough for this movie.";
CustomExceptions(s)
}
}
这行得通吗?还是我被迫创建多个自定义异常文件?
一般自定义异常应该定义在顶层。因为,几乎普遍地,这些异常是包或模块的接口的一部分。
如果用户看不到它们,那么他们将如何单独捕捉它们?如果您不想单独捕获它们,那么为什么需要单独的 classes?
但是,如果必须,您可以将它们包含在需要它们的 class 中:
public class SeatReservationSystem {
public static class ReservationFailedException {
... constructors taking a message ...
}
public static class SeatTakenException extends ReservationFailedException {
... constructors taking a message ...
}
public static class OutsideAgeException extends ReservationFailedException {
... constructors taking a message ...
}
....
}
之后,您可以根据需要创建 returns 它们的任何方法。不要创建 throw 它们的方法,因为编译器不会将它们视为您所在块的出口点,并且您会遇到奇怪的情况。
下面是一些代码来说明我的意思:
// wrong
public static void throwRuntimeException() throws RuntimeException {
throw new RuntimeException();
}
// correct, but dangerous
public static RuntimeException createRuntimeException() {
return new RuntimeException();
}
public static void main(String[] args) {
String initializeMeOrThrowException;
if (new Random().nextBoolean()) {
// compiler doesn't recognize that the method always throws an exception
throwRuntimeException();
// this the compiler can understand, there is an explicit throw here:
// throw createRuntimeException();
// but this is the pitfall, it doesn't do anything:
// createRuntimeException();
} else {
initializeMeOrThrowException = "Initialized!";
}
// Compiler error for throwRuntimeException and createRuntimeException without throws:
// "The local variable initializeMeOrThrowException may not have been initialized"
System.out.println(initializeMeOrThrowException);
}
然而,经验告诉我,我忘记了 throw createException(...);
方法的 throws
语句,而愚蠢的编译器并没有警告我(即使没有它这个语句是完全无用的) ).所以我试着不使用任何一个。
请注意,我不确定您是否应该为此使用例外。如果您的系统是预订系统,那么拒票并不是那么例外。返回 ReservationResult
更有意义。
我正在尝试通过自定义异常处理异常。
我正在创建 class CustomExceptions 并按如下方式扩展异常:
public class CustomExceptions extends Exception{
public CustomExceptions (String s) {
super(s);
}
但是,我不想为我想要的每个自定义异常创建多个文件,也不想使我的主 class 文件膨胀,我想将所有自定义异常放在这个 class 中并通过方法调用它们
假设我要处理两种情况:当用户尝试输入座位预订但座位已被占用时,以及当用户尝试为年龄范围以外的人提供机票时。
我可以在 CustomExceptions class 中创建 2 个方法来调用向其传递自定义消息的构造函数吗?
public void seatTaken(String s) {
String s = "The seat is taken, please choose a new one";
CustomExceptions(s);
}
public void notOldEnough(String s) {
String s = "User is not old enough for this movie.";
CustomExceptions(s)
}
}
这行得通吗?还是我被迫创建多个自定义异常文件?
一般自定义异常应该定义在顶层。因为,几乎普遍地,这些异常是包或模块的接口的一部分。
如果用户看不到它们,那么他们将如何单独捕捉它们?如果您不想单独捕获它们,那么为什么需要单独的 classes?
但是,如果必须,您可以将它们包含在需要它们的 class 中:
public class SeatReservationSystem {
public static class ReservationFailedException {
... constructors taking a message ...
}
public static class SeatTakenException extends ReservationFailedException {
... constructors taking a message ...
}
public static class OutsideAgeException extends ReservationFailedException {
... constructors taking a message ...
}
....
}
之后,您可以根据需要创建 returns 它们的任何方法。不要创建 throw 它们的方法,因为编译器不会将它们视为您所在块的出口点,并且您会遇到奇怪的情况。
下面是一些代码来说明我的意思:
// wrong
public static void throwRuntimeException() throws RuntimeException {
throw new RuntimeException();
}
// correct, but dangerous
public static RuntimeException createRuntimeException() {
return new RuntimeException();
}
public static void main(String[] args) {
String initializeMeOrThrowException;
if (new Random().nextBoolean()) {
// compiler doesn't recognize that the method always throws an exception
throwRuntimeException();
// this the compiler can understand, there is an explicit throw here:
// throw createRuntimeException();
// but this is the pitfall, it doesn't do anything:
// createRuntimeException();
} else {
initializeMeOrThrowException = "Initialized!";
}
// Compiler error for throwRuntimeException and createRuntimeException without throws:
// "The local variable initializeMeOrThrowException may not have been initialized"
System.out.println(initializeMeOrThrowException);
}
然而,经验告诉我,我忘记了 throw createException(...);
方法的 throws
语句,而愚蠢的编译器并没有警告我(即使没有它这个语句是完全无用的) ).所以我试着不使用任何一个。
请注意,我不确定您是否应该为此使用例外。如果您的系统是预订系统,那么拒票并不是那么例外。返回 ReservationResult
更有意义。