我可以在单个 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 更有意义。