Как проверить ввод через конструктор в Java - PullRequest
0 голосов
/ 23 мая 2018

Я прочитал, что можно создать конструктор, который проверяет правильность ввода или нет, и я попытался сделать это с 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 голосов
/ 23 мая 2018

Вам нужно перехватить исключение при создании экземпляра вашего нового объекта, в этом случае ваше второе решение в порядке, кроме основного, которое вы бы сделали:

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,
}

Тогда ваш конструктор будет выглядеть так:

public Knoten(KnotenType type) {
    ...
}

Подробнее о перечислениях: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

0 голосов
/ 23 мая 2018

в вашем коде есть ошибка опечатки.Используйте

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

и также запоминающее устройство, чтобы поймать исключение, которое выдается конструктором

0 голосов
/ 23 мая 2018

Я полагаю, что вы получаете ошибку компиляции, такую ​​как: Unhandled exception type Exception, и вы получаете это, когда выкидываете Checked Exception (java.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.

try {
    Knoten Knot1 = new Knoten("haha");
} catch (Exception e) {
    e.printStackTrace();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...