TD 5 - Les exceptions

Exercice 1 - Division par zéro

1-
class DivisionByZero{
    public static void main(String[] sArgs){
        int i=1/0;
    }
}

Il y a sortie du programme car c'est la JVM qui va capturer l'exception mais en dehors de la classe.

2-
class DivisionByZero{
    public static void main(String[] sArgs){
        int i;
        try{
            i=1/0;
        }
        catch(Exception e){
        }
    }
}

L'exception générée est une ArithmeticException

3-
class DivisionByZero{
    public static void main(String[] sArgs){
        int i;
        try{
            i=1/0;
        }
        catch(Exception e){
            System.out.println("Attention erreur !");
            e.printStackTrace();
        }
    }
}

4-
class DivisionByZero{
    public static void main(String[] sArgs){
        int i;
        try{
            i=1/0;
        }
        catch(Exception e){
            System.out.println("Attention erreur !");
            e.printStackTrace();
            i=1;
            ....
        }
    }
}



Exercice 2 - L'âge du capitaine

1-
class AgeCapException extends Exception{
    int iAge;
    AgeCapException(int iAge){
        this.iAge=iAge;
    }
    public String toString(){
        return new String(iAge +" n'est pas un âge valide");
    }
}

2-
import java.io.*;
class AgeCap {

   int iAge;
    public static void main(String[] sArgs){
        new AgeCap();  //le main sert uniquement à instancier la classe courante, ceci évite d'avoir à utiliser des variables et méthodes statiques
    }
    AgeCap(){
        try{
            iAge=getAgeCap();
            System.out.println("Age= "+iAge+" ans");
        }
        catch(AgeCapException ace){
            ace.printStackTrace();
        }
        catch(Exception e){ //on capture toutes les autres exceptions
            e.printStackTrace();
        }
    }

   public int getAgeCap() throws AgeCapException,Exception{
      char c;
      int iAge;
      System.out.print("Age du capitaine : ");
      BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
      String sAge=br.readLine();
      iAge=Integer.parseInt(sAge.trim()); //le trim enlève le '\n' et parseInt() transforme un String en int primitif
      if (iAge<18 || iAge>65){
          throw new AgeCapException(iAge); //on lève une AgeCapException en cas d'erreur
      }
      return iAge;
   }
}

3-
import java.io.*;
class AgeCap {

   int iAge;
    public static void main(String[] sArgs){

        new AgeCap();
    }
    AgeCap(){
        iAge=getAgeCap();
        System.out.println("Age= "+iAge+" ans");
    }
    public int getAgeCap(){
      char c;
      System.out.print("Age du capitaine : ");
      BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
      try{

         String sAge=br.readLine();
         iAge=Integer.parseInt(sAge.trim());

         if (iAge<18 || iAge>65){
            throw new AgeCapException(iAge);
         }
      }
      catch(AgeCapException ace){
         ace.printStackTrace();
         iAge=0;
      }
      catch(Exception e){
         e.printStackTrace();
         iAge=0;
      }
      return iAge;
   }
}

4-
import java.io.*;
class AgeCap {

   int iAge;
    public static void main(String[] sArgs){
        new AgeCap();
    }
    AgeCap(){
        int iComp=0;
        boolean bQuit=false;
        while(!bQuit){
            try{
                iAge=getAgeCap();
                System.out.println("Age= "+iAge+" ans");
                bQuit=true;
            }

            catch(Exception e){
                e.printStackTrace();
                iComp++;
                System.out.println(iComp+" essai(s)");
            }
       }
   }

   public int getAgeCap() throws Exception{
      char c;
      System.out.print("Age du capitaine : ");
      BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
      try{
         String sAge=br.readLine();
         iAge=Integer.parseInt(sAge.trim());
         if (iAge<18 || iAge>65){
            throw new AgeCapException(iAge);
         }
      }
      catch(AgeCapException ace){ //on capture l'AgeCapException
         ace.printStackTrace();
         throw new Exception(); //on lève une Exception
      }
      catch(Exception e){
         e.printStackTrace();
         throw new Exception(); //on lève une Exception
      }
      return iAge;
   }
}



Exercice 3- Saisie d'un mot de passe

1 et 2-
class WrongPwdException extends Exception{
    public String toString(){
        return "Mauvais mot de passe";
    }
}

class WrongInputLengthException extends Exception{
    public String toString(){
        return "Trop de caractères en entrée";
    }
}

class WrongLoginException extends Exception{
        public String toString(){
        return "login inexistant";
    }
}

3-
import java.io.*;
class Login{
    static final String sRightLogin="scott";
    static final String sRightPwd="tiger";
    public static void main(String[] sArgs){
        new Login();
    }
    Login(){
        while(true){
             try{
                    getUserPwd();
                    System.out.println("Login/mot de passe valides");
              }
            catch(WrongLoginException wle){
                wle.printStackTrace();
            }
            catch(WrongPwdException wpe){
                wpe.printStackTrace();
            }
            catch(WrongInputLengthException wile){
                wile.printStackTrace();
                System.exit(0); //risque d'attaque, on sort du programme
            }
            catch(IOException ioe){
                ioe.printStackTrace();
                System.exit(0); //risque d'attaque, erreur d'entrée/sortie
            }
            catch(Exception e){
                e.printStackTrace();
                System.exit(0); //Pbm inconnu, pour ne pas prendre de risque, on sort
            }
        }
    }

    public void getUserPwd() throws WrongLoginException,WrongPwdException,WrongInputLengthException,IOException{
        char c;
        String sLogin="";
        String sPwd="";
        System.out.println("Utilisateur: ");
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        sLogin=br.readLine();
        System.out.println("Mot de passe:");
        sPwd=br.readLine();
        if (sLogin.length()>8 || sPwd.length()>8){

             throw new WrongInputLengthException();
        }
        if (!sLogin.trim().equals(sRightLogin)){
             throw new WrongLoginException();
        }
        if (!sPwd.trim().equals(sRightPwd)){
             throw new WrongPwdException();
         }
    }
}