J'ai lu qu'il est possible de créer un constructeur qui vérifie si l'entrée est correcte ou non et j'ai essayé de le faire avec une IllegalArgumentException. Mon code fonctionne bien tant que je ne crée pas d'objet, peu importe si l'entrée est correcte ou non, le compilateur donnera une erreur. Voici mon code:

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

J'ai également essayé de faire cela, obtenant le même résultat:

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

}

}

Ma question est donc de savoir si je dois gérer l'exception chaque fois que je crée un objet de cette classe ou s'il existe une meilleure façon de le faire.

0
Nadia Rodriguez 23 mai 2018 à 20:11

3 réponses

Meilleure réponse

Je crois que vous obtenez une erreur de compilation comme: Unhandled exception type Exception et que vous obtenez ceci lorsque vous lancez un Checked Exception (java.lang.Exception) depuis le constructor. Ne mettez aucune exception dans les lancers ou n'essayez pas de lancer l'exception non cochée comme:

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");
    }

}

Ou entourez-le Constructor try catch/finally.

try {
    Knoten Knot1 = new Knoten("haha");
} catch (Exception e) {
    e.printStackTrace();
}
1
Amit Bera 23 mai 2018 à 17:24

Vous devez attraper l'exception lorsque vous instanciez votre nouvel objet, dans ce cas, votre deuxième solution convient, sauf sur main que vous feriez:

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

De plus, j'envisagerais vraiment d'utiliser enums pour votre solution, et vous n'auriez alors pas besoin de valider votre type lors de la création d'un nouvel objet. Par exemple, vous pourriez avoir un enum comme ceci:

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

Ensuite, votre constructeur ressemblerait à:

public Knoten(KnotenType type) {
    ...
}

Plus d'informations sur Enums: https://docs.oracle.com/javase /tutorial/java/javaOO/enum.html

0
Omar Silva 23 mai 2018 à 17:25

Vous avez une faute de frappe dans votre code. Utilisation

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

Et rappelez-vous également d'attraper l'exception qui est levée par le constructeur

0
Joseph Peter 23 mai 2018 à 17:48