Tester si un paramètre est de type entier
Sken
-
Sken -
Sken -
Bonsoir,
Je cherche à réaliser le constructeur de la classe Personne qui initialise les attributs String nom, prénom, adresse et carte d'identité ainsi que le long téléphone à partir de valeurs saisies au clavier. Si le téléphone n'est pas un entier positif, je dois générer une exception du type TéléphoneInvalide.
J'ai essayé de la façon suivante :
import java.io.IOException;
import java.io.*;
import java.util.*;
import java.awt.*;
public class Personne {
// Déclaration des attributs
protected String nom;
protected String prénom;
protected String adresse;
protected String cartedidentité;
protected long téléphone;
// Constructeur de la classe Personne
public Personne(String n, String p, String a, String c, long t){
this.nom=n;
this.prénom=p;
this.adresse=a;
this.cartedidentité=c;
try{
if(t == Integer.parseInt(StdInput.readLine()))
this.téléphone=t;
else throw new TéléphoneInvalide();
}
catch(IOException e){
System.out.println("Ceci n'est pas un entier");
}
catch(TéléphoneInvalide e){
System.out.println("Le téléphone saisi n'est pas un entier");
}
}
Mais lorsque je teste et je ne rentre pas un entier je reçois seulement l'exception classique "Bad Integer" et le "blabla" de la machine et non le traitement que j'impose.
Si quelqu'un a une idée de l'origine du problème.
Merci d'avance.
Je cherche à réaliser le constructeur de la classe Personne qui initialise les attributs String nom, prénom, adresse et carte d'identité ainsi que le long téléphone à partir de valeurs saisies au clavier. Si le téléphone n'est pas un entier positif, je dois générer une exception du type TéléphoneInvalide.
J'ai essayé de la façon suivante :
import java.io.IOException;
import java.io.*;
import java.util.*;
import java.awt.*;
public class Personne {
// Déclaration des attributs
protected String nom;
protected String prénom;
protected String adresse;
protected String cartedidentité;
protected long téléphone;
// Constructeur de la classe Personne
public Personne(String n, String p, String a, String c, long t){
this.nom=n;
this.prénom=p;
this.adresse=a;
this.cartedidentité=c;
try{
if(t == Integer.parseInt(StdInput.readLine()))
this.téléphone=t;
else throw new TéléphoneInvalide();
}
catch(IOException e){
System.out.println("Ceci n'est pas un entier");
}
catch(TéléphoneInvalide e){
System.out.println("Le téléphone saisi n'est pas un entier");
}
}
Mais lorsque je teste et je ne rentre pas un entier je reçois seulement l'exception classique "Bad Integer" et le "blabla" de la machine et non le traitement que j'impose.
Si quelqu'un a une idée de l'origine du problème.
Merci d'avance.
A voir également:
- Tester si un paramètre est de type entier
- Flash drive tester - Télécharger - Divers Utilitaires
- Tester les performances de son pc - Guide
- Parametre dns - Guide
- Remettre parametre usine pc - Guide
- Parametre windows - Guide
1 réponse
1) t est de type long, Integer.parseInt(StdInput.readLine()) est de type Integer, il peut y avoir un problème. De même il faut se méfier de l'opérateur == qui compare deux objets mais pas leur valeur, contrairement à la méthode equals qui est faite pour ça.
2) si Integer.parseInt ne fonctionne pas elle renvoit java.lang.NumberFormatException, mais tu ne fais pas de catch pour ce cas donc du coup ça peut planter quand même...
Le catch d'IOException ne sert à rien car rien dans ton code ne peut le générer.
Remarque : Avec Scanner tu peux directement faire nextLong, ce qui t'évite de faire un parseLong sur ton NextLine, mais dans ce cas on n'aura plus NumberFormatException, mais InputMismatchException .
2) si Integer.parseInt ne fonctionne pas elle renvoit java.lang.NumberFormatException, mais tu ne fais pas de catch pour ce cas donc du coup ça peut planter quand même...
Le catch d'IOException ne sert à rien car rien dans ton code ne peut le générer.
try
{
if (Long.parseLong(StdInput.readLine().equals(t))
this.téléphone = t;
else
throw new TéléphoneInvalide();
}
catch (NumberFormatException e) // Long.parseLong
{
System.out.println("Ceci n'est pas un entier");
}
catch (TéléphoneInvalide e)
{
System.out.println("L'entier saisi n'est pas positif.");
}
Remarque : Avec Scanner tu peux directement faire nextLong, ce qui t'évite de faire un parseLong sur ton NextLine, mais dans ce cas on n'aura plus NumberFormatException, mais InputMismatchException .
L'import c'est java.lang.Long, mais normalement il n'y en a pas besoin...
Personne.java:38: cannot find symbol
symbol: method parseLong(boolean)
location: class java.lang.Long
if(Long.parseLong(StdInput.readLine().equals(t)))
1 error.
long cannot be dereferenced
1) parseLong renvoie un élément de type long (et non pas Long), donc equals n'est pas défini, pour le coup il faudra donc bien utiliser ==
2) je pensais que StdInput était un Scanner mais en fait non (j'ai confondu readLine avec nextLine), donc tu vas bien avoir un IOException a récupérer au cas où tu ne peux pas lire.
try { if (Long.parseLong(StdInput.readLine())==t) this.téléphone = t; else throw new TéléphoneInvalide(); } catch (IOException e) { System.out.println("Impossible de lire les données."); } catch (NumberFormatException e) // Long.parseLong { System.out.println("Ceci n'est pas un entier"); } catch (TéléphoneInvalide e) { System.out.println("L'entier saisi n'est pas positif."); }