如何通过java中的构造函数验证输入

时间:2018-05-23 17:11:36

标签: java validation exception exception-handling

我已经读过可以创建一个构造函数来检查输入是否正确,我尝试使用IllegalArgumentException。我的代码工作正常,只要我不创建一个对象,输入是否正确无关紧要,编译器会给出错误。这是我的代码:

public class Knoten{
private String typ;

public Knoten(String typ) throws Exception{
  try{
    if (typ.equals ("BASE")||typ.equals ("WORD")||typ.equals ("ROOT")||typ.equals ("AFFIX")){
      this.typ=typ;
    }}catch(IllegalArgumentException ex){
       System.out.println ("invalid typ");
    }}
  public String getTyp(){
        return typ;
    }

  public String toString(){
        return "typ: "+getTyp();
    }

public static void main (String args[]){
Knoten Knot1= new Knoten("haha");//throws error
Knoten Knot2= new Knoten("BASE");//throws error
}}

我也尝试过这样做,得到相同的结果:

public class Knoten{
  private String typ;

  public Knoten(String typ) throws Exception{
    if (typ.equals ("BASE")||typ.equals ("WORD")||typ.equals ("ROOT")||typ.equals ("AFFIX")){
        this.type=type;
    }else{
         throw new IllegalArgumentException("invalid type");
    }

    }
  public String getTyp(){
    return typ;
}

  public String toString(){
    return "typ: "+getTyp();
}

public static void main (String args[]){
Knoten Knot1= new Knoten("haha");//throws error
Knoten Knot2= new Knoten("BASE");//throws error

}

}

所以我的问题是,如果我每次创建该类的对象时都必须处理异常,或者是否有更好的方法来执行此操作。

3 个答案:

答案 0 :(得分:1)

我相信您收到编译错误,例如:ImageView,当您从Unhandled exception type Exception投掷Checked Exceptionjava.lang.Exception)时,您就会收到此错误。不要在抛出中放置任何异常或尝试抛出未经检查的异常,如:

constructor

或围绕它构造函数public Knoten(String type) throws IllegalArgumentException { // throws unchecked exception is optional if (type.equals("BASE") || type.equals("WORD") || type.equals("ROOT") || type.equals("AFFIX")) { this.type = type; } else { throw new IllegalArgumentException("invalid type"); } }

try catch/finally

答案 1 :(得分:0)

您需要在实例化新对象时捕获异常,在这种情况下,您的第二个解决方案没问题,除了您要执行的主要操作:

try {
    Knoten Knot1 = new Knoten("haha");
} catch (Exception e) {
    e.printStackTrace();
}

另外,我真的会考虑使用public static void main (String args[]){ try { Knoten Knot1= new Knoten("haha"); // This will throw error Knoten Knot2= new Knoten("BASE"); } catch (IllegalArgumentException e) { // deal with exception here } } 作为您的解决方案,然后在创建新对象时不需要验证您的类型。例如,您可以像enums这样:

enum

然后你的构造函数看起来像:

public enum KnotenType {
     BASE,
     WORD,
     ROOT,
     AFFIX,
}

有关枚举的更多信息:https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

答案 2 :(得分:0)

您的代码中存在拼写错误。使用

this.typ = typ; // instead of this.type = type; 

并且还记得捕获构造函数抛出的异常