是否可以为 customException 显示不同的超级(消息)?

Is it possible to have a different super(message) be displayed for a customException?

我有一个自定义异常 class InvalidNameException 如果输入字符串太短或有任何特殊字符,它应该处理错误。

我想知道是否可以根据输入名称满足的条件显示不同的super(message)

理想情况下应该是这样的,但是由于 super(message) 需要成为构造函数中的第一条消息,我很好奇这是否可以完成,或者我是否需要找到另一种方法来做到这一点。

customException class 看起来像这样

    class InvalidNameException extends Exception
    {
      public InvalidNameException(String name)  {     
        if(validName(name)){  
         super("Name Contains Special Characters"); 
        }
        else if(validLength(name)){
         super("Name is too long");     
        }
      }
      public boolean validName(String name){
            boolean check = true;
            for (int i = 0; i < name.length(); i++) {        
                 if (!Character.isLetter(name.charAt(i))
                  && !Character.isWhitespace(name.charAt(i))) {               
                  check = false;
              }
          }
            return check;   
      }
      
      public boolean validLength(String name){
        boolean check = true;
        if(name.length()<6) {
            check = false;
        }
        return check;  
      }
    }

你不能调用 super 两次。为了使这项工作有效,您必须像这样为每个条件抛出一个新的异常:

public InvalidNameException(String name) throws Exception {
    if(validName(name)){
        throw new Exception("Name Contains Special Characters");
    }
    else if(validLength(name)){
        throw new Exception("Name is too long");
    }
}

让我们回到开头说(我的评论不清楚,对此感到抱歉),您 可以 通过将方法定义为静态来获得不同的 super(message)

class InvalidNameException extends Exception {
    public static InvalidNameException ofName(String name) {
        if (validName(name)) {
            return new InvalidNameException("Name Contains Special Characters");
        }

        if (validLength(name)) {
            return new InvalidNameException("Name is too long");
        }

        return null;
    }

    private InvalidNameException(String message)  {
        super(message);
    }
    public static boolean validName(String name){
        ...
    }

    public static boolean validLength(String name){
        ...
    }
}

然而,通过这样做,由于异常实例是有条件地生成的,您必须在调用函数时编写另一个验证。它的输出不够清晰,你很容易犯 NullPointerException.

这样的错误
public void foobarMethod(String name) throws InvalidNameException {
    InvalidNameException exception = InvalidNameException.ofName(name);
    if (exception != null) {
        throw exception;
    }
}

另外,InvalidNameException 是定义错误,也是验证数据。这就是我说角色不明确的地方。

我的建议是在 class 中定义 setter 方法,它包含 name(比如,Person),因为存储和验证之间有更深层次的联系比异常定义。

class InvalidNameException extends Exception {
    private final String name;

    public String getName() {
        return this.name;
    }

    private InvalidNameException(String name, String message) {
        super(message);
        this.name = name;
    }

    public static InvalidNameException invalidCharacter(String name) {
        return new InvalidNameException(name, "Name Contains Special Characters");
    }

    public static InvalidNameException invalidLength(String name) {
        return new InvalidNameException(name, "Name is too long");
    }
}

class Person {
    private String name;

    public void setName(String name) throws InvalidNameException {
        if (validName(name)) {
            throw InvalidNameException.invalidCharacter(name);
        }

        if (validLength(name)) {
            throw InvalidNameException.invalidLength(name);
        }

        this.name = name;
    }

    public static boolean validName(String name){
        ...
    }

    public static boolean validLength(String name){
        ...
    }
}

class Foobar {
    public void insertPerosn(String name) {
        try {
            Person person  = new Person();
            person.setName(name);
        } catch (InvalidNameException e) {
            System.out.println(e.getMessage());
            System.out.println("Your input is: " + e.getName());
        }
    }
}


这个问题没有完美的答案,但至少这是我的看法。