Je suis dans la partie Exceptions du cours apprenez à programmer en java et un doute m'assaille.
Je n'ai aucune erreur dans mes classes dans Eclipse et pourtant le programme s'arrête quand je le lance dans la console. Est-ce normal ?
Voici le code de mes classes.
Ville.java
public class Ville {
//Variables publiques qui comptent les instances
public static int nbreInstances = 0;
//Variable privée qui comptera aussi les instances
protected static int nbreInstancesBis = 0;
//Stocke le nom de notre ville
protected String nomVille;
//Stocke le nom du pays de notre ville
protected String nomPays;
//Stocke le nombre d'habitants de notre ville
protected int nbreHabitants;
protected char categorie;
//Constructeur par défaut
public Ville(){
//On incrémente nos variables à chaque appel aux constructeurs
nbreInstances++;
nbreInstancesBis++;
System.out.println("Création d'une ville !");
nomVille = "Inconnu";
nomPays = "Inconnu";
nbreHabitants = 0;
this.setCategorie();
}
//Constructeur avec paramètres
//J'ai ajouté un « p » en première lettre des paramètres.
//Ce n'est pas une convention, mais ça peut être un bon moyen de les repérer.
public Ville(String pNom, int pNbre, String pPays)
throws NombreHabitantException, NomVilleException
{
if(pNbre < 0)
throw new NombreHabitantException(pNbre);
if(pNom.length() < 3)
throw new NomVilleException("Le nom de la ville est inferieur à 3 caractères ! nom = "+pNom);
else
{
//On incrémente nos variables à chaque appel aux constructeurs
nbreInstances++;
nbreInstancesBis++;
System.out.println("Création d'une ville avec des paramètres !");
nomVille = pNom;
nomPays = pPays;
nbreHabitants = pNbre;
this.setCategorie();
}
}
Capitale.java
public class Capitale extends Ville {
private String monument;
//Constructeur par défaut
public Capitale(){
//Ce mot clé appelle le constructeur de la classe mère
super();
monument = "aucun";
}
//Constructeur d'initialisation de capitale
public Capitale(String nom, int hab, String pays, String monument)
throws NombreHabitantException, NomVilleException
{
super(nom, hab, pays);
this.monument = monument;
if(hab < 0)
throw new NombreHabitantException(hab);
if(nom.length() < 3)
throw new NomVilleException("Le nom de la ville est inferieur à 3 caractères ! nom = "+nom);
else
{
}
}
public String decrisToi(){
String str = super.decrisToi() + "\n \t ==>>" + this.monument+ " en est un monument";
return str;
}
public String toString(){
String str = super.toString() + "\n \t ==>>" + this.monument + " en est un monument";
return str;
}
/**
* @return le nom du monument
*/
public String getMonument() {
return monument;
}
//Définit le nom du monument
public void setMonument(String monument) {
this.monument = monument;
}
}
NombreHabitantException.java
class NombreHabitantException extends Exception{
public NombreHabitantException(int nbre) {
System.out.println("Instanciation avec un nombre d'habitants négatif.");
System.out.println("\t => " + nbre);
}
}
NomVilleException.java
public class NomVilleException extends Exception {
public NomVilleException(String message) {
super(message);
}
}
et enfin mon "main"
Sdz1.java
public class Sdz1 {
public static void main(String[] args) {
//Définition d'un tableau de villes null
Ville[] tableau = new Ville[6];
//Définition d'un tableau de noms de Villes et un autre de nombres d'habitants
String[] tab = {"Marseille", "lille", "ca", "lyon", "paris", "nantes"};
int[] tab2 = {123456, 78456, 654987, 75832165, 1594, 213};
//Les trois premiers éléments du tableau seront des Villes
//et le reste des capitales
Ville v = null;
Capitale c = null;
for(int i = 0; i < 6; i++){
if (i <3){
try {
v = new Ville(tab[i], tab2[i], "france");
tableau[i] = v;
} catch (NombreHabitantException | NomVilleException e2) {
System.out.println(e2.getMessage());
}
finally {
if (v == null)
v = new Ville();
}
}
else{
try {
c = new Capitale(tab[i], tab2[i], "france", "la tour Eiffel");
tableau[i] = c;
} catch (NombreHabitantException | NomVilleException e2) {
System.out.println(e2.getMessage());
}
finally {
if (c == null)
c = new Capitale();
}
}
}
//Il ne nous reste plus qu'à décrire tout notre tableau !
for(Object obj : tableau){
System.out.println(obj.toString()+"\n");
}
}
}
Le code de la class Ville est dans le cours j'ai donc adapté le code de la Class Capitale et modifié le code de la class Sdz1
Création d'une ville avec des paramètres ! Création d'une ville avec des paramètres ! Le nom de la ville est inferieur à 3 caractères ! nom = ca Création d'une ville avec des paramètres ! Création d'une ville avec des paramètres ! Création d'une ville avec des paramètres ! Marseille est une ville de france, elle comporte : 123456 habitant(s) => elle est donc de catégorie : D
lille est une ville de france, elle comporte : 78456 habitant(s) => elle est donc de catégorie : C
Exception in thread "main" java.lang.NullPointerException at Sdz1.main(Sdz1.java:46)
Quand il n'y a pas d'erreur le code fonctionne parfaitement bien, dans l'exemple, j'ai mis une erreur sur le nombre de lettres d'une ville pour tester la gestion des exceptions
Quand tu as une exception, tu n'ajoutes pas de ville dans ton tableau, ton tableau comporte du coup moins de 6 éléments. Tu dois donc vérifier que obj n'est pas nul avant de faire ton System.out.println(obj)
public class Sdz1 {
public static void main(String[] args) {
//Définition d'un tableau de villes null
Ville[] tableau = new Ville[6];
//Définition d'un tableau de noms de Villes et un autre de nombres d'habitants
String[] tab = {"Marseille", "lille", "ca", "lyon", "paris", "nantes"};
int[] tab2 = {123456, 78456, 654987, 75832165, 1594, 213};
//Les trois premiers éléments du tableau seront des Villes
//et le reste des capitales
Ville v = null;
Capitale c = null;
for(int i = 0; i < 6; i++){
if (i <3){
try {
v = new Ville(tab[i], tab2[i], "france");
tableau[i] = v;
} catch (NombreHabitantException | NomVilleException e2) {
System.out.println(e2.getMessage());
}
finally {
if (v == null)
v = new Ville();
}
}
else{
try {
c = new Capitale(tab[i], tab2[i], "france", "la tour Eiffel");
tableau[i] = c;
} catch (NombreHabitantException | NomVilleException e2) {
System.out.println(e2.getMessage());
}
finally {
if (c == null)
c = new Capitale();
}
}
}
//Il ne nous reste plus qu'à décrire tout notre tableau !
for(Object obj : tableau){
if (obj == null)
obj = new Object();
System.out.println(obj.toString()+"\n");
}
}
}
Création d'une ville avec des paramètres ! Création d'une ville avec des paramètres ! Le nom de la ville est inferieur à 3 caractères ! nom = ca Création d'une ville avec des paramètres ! Création d'une ville avec des paramètres ! Création d'une ville avec des paramètres ! Marseille est une ville de france, elle comporte : 123456 habitant(s) => elle est donc de catégorie : D
lille est une ville de france, elle comporte : 78456 habitant(s) => elle est donc de catégorie : C
java.lang.Object@15db9742
lyon est une ville de france, elle comporte : 75832165 habitant(s) => elle est donc de catégorie : H ==>>la tour Eiffel en est un monument
paris est une ville de france, elle comporte : 1594 habitant(s) => elle est donc de catégorie : B ==>>la tour Eiffel en est un monument
nantes est une ville de france, elle comporte : 213 habitant(s) => elle est donc de catégorie : A ==>>la tour Eiffel en est un monument
Apparemment le code continue de s'executer c'est super, mais serait il possible de mettre l explication prévue, à la place du code erreur ?
Code erreur ?? tu veux dire "java.lang.Object@15db9742" ce n'est pas un code d'erreur, c'est le résultat de la fonction toString() d'un objet de type Object.
-Ton Tableau comporte toujours 6 éléments pas moins pas plus.
-Si tu utilise System.out.println(obj), ta pas besoin de faire un test de nullité sur ton objet, la fonction System.out.println le fait pour toi
Après si tu fait System.out.println(obj) la fonction va appeler automatiquement le toString de ton objet obj si la Class de ton objet n’implémente pas la fonction toString elle va appeler le toString de sa class mère et ainsi de suite ....
Tu affiche déja l explication prévue tu veux la (re)afficher .... ?
Par contre si je ne fais pas le test de nullité j'obtiens le resultat suivant
Instanciation avec un nombre d'habitants négatif. => -78456 null Marseille est une ville de france, elle comporte : 123456 habitant(s) => elle est donc de catégorie : D
Exception in thread "main" java.lang.NullPointerException at Sdz1.main(Sdz1.java:47)
pour moi ce n'est pas une solution, tu le fait juste pour évite l'exception alors ....
alors que un truc comme ça:
if(obj != null) {
Sysem.out.println(obj);
// ou obj.xX j'invoque une methode (dans ton exemple obj.toString())
}else {
// je fait quoi quand un element de mon tableau est null ??
// je ne peux pas invoquer de method sur obj "un object null"
}
PS : si tu utilise println ta pas besoin d'ajouter le "\n" println le fe automatiquement,
System.out.println() va automatiquement appeler la méthode toString() de l'objet passé en paramètre. Le résultat est donc le même. (Hormis pour le "\n")
System.out.println() va automatiquement appeler la méthode toString() de l'objet passé en paramètre. Le résultat est donc le même. (Hormis pour le "\n")
@ NoneNone1 : J'ai bien pris tes explications en compte. Il est évident qu'il faut faire quelque chose pour réparer l'erreur, mais ici je suis dans le cours, j'essaye d'abord de comprendre le fonctionnement. Ta dernière méthode me va beaucoup mieux en termes de résultat, je garde ça sous le coude. Merci encore
Jean-Luc D.
Gerer plusieurs exceptions
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.