Hum c'est mon tour de poser une question (TP garage)
J'arrive à afficher correctement le texte qu'il faut, mais manifestement le problème se situe dans la partie Input/Output, précisément Output d'après ma session debugging. A la lecture, il y a des messages "Source Unknown" au call de ma méthode Vehicule.toString(). Je ne comprends ce qu'il se passe :/.
Merci de votre aide chers Zeros!
j'obtiens le log d'erreurs suivant :
Exception in thread "main" java.lang.NullPointerException
at com.sdz.garage.Vehicule.toString(Vehicule.java:38)
at com.sdz.garage.Garage.toString(Garage.java:60)
at java.lang.String.valueOf(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at com.sdz.garage.Test.main(Test.java:13)
Voici ma classe Garage :
package com.sdz.garage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class Garage {
private List<Vehicule> voitures;
// Constructeur
public Garage (){
voitures = new ArrayList<Vehicule>();
}
// Ajouter une voiture au fichier garage
public void addVoiture(Vehicule voit) {
voitures.add(voit);
//Nous déclarons nos objets en dehors du bloc try/catch
ObjectOutputStream oos;
try {
oos = new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream(
new File("garage.txt"))));
for(Vehicule vh : voitures) {
oos.writeObject(vh);
}
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// Imprime le contenu du garage
public String toString(){
//Nous déclarons nos objets en dehors du bloc try/catch
ObjectInputStream ois;
String str = "***************************\n* Garage OpenClassrooms *\n***************************\n";
try{
ois = new ObjectInputStream(
new BufferedInputStream(
new FileInputStream(
new File("garage.txt"))));
try{
System.out.println(((Vehicule)ois.readObject()).toString());
System.out.println(((Vehicule)ois.readObject()).toString());
System.out.println(((Vehicule)ois.readObject()).toString());
System.out.println(((Vehicule)ois.readObject()).toString());
System.out.println(((Vehicule)ois.readObject()).toString());
System.out.println(((Vehicule)ois.readObject()).toString());
}catch(ClassNotFoundException e){
e.printStackTrace();
}
ois.close();
}
catch(FileNotFoundException e){
try {
throw new Exception("Aucune voiture sauvegardée! ");
} catch (Exception e1) {
e1.printStackTrace();
}
} catch(IOException e){
e.printStackTrace();
}
return str;
}
}
ma classe Vehicule
package com.sdz.garage;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.sdz.option.Option;
public abstract class Vehicule implements Serializable {
/**
*
*/
private static final long serialVersionUID = -3513552697329449267L;
private static double prix;
private String nom;
protected transient List<Option> options= new ArrayList<Option>();;
private transient Marque nomMarque;
protected transient Moteur moteur;
//Constructeur par défaut
public Vehicule (){
}
// Constructeur avec paramètres
public Vehicule(String nom, double prix, List<Option> options, Marque nomMarque)
{
this.nom = nom;
this.prix = prix;
this.options = options;
this.nomMarque = nomMarque;
}
//Méthode d'affichage
public String toString()
{
String str = "Voiture " + getMarque() +" : "+ getNom() + " " + moteur.toString();
if (options.size() > 0)
{
for(Option e : options)
{
str += "avec les options [ " + e.getTypeOption() + "(" + e.getPrix() + "€) ]";
}
} else
{
str += "sans options";
}
str += " d'une valeur totale de " + getPrix() + "€";
return str;
}
public Marque getMarque()
{
return nomMarque;
}
public List<Option> getOptions()
{
return options;
}
public double getPrix()
{
double res = moteur.getPrix();
for(Option e : options)
{
res += e.getPrix();
}
return res;
}
public void addOption(Option opt){
options.add(opt);
}
public void setMoteur (Moteur m)
{
moteur=m;
}
public String getNom(){
return this.nom;
}
}
et ma classe Test (identique à 90% à celle fournie)
Moi ce qui me choque c'est surtout que, vu la définition de sa classe Vehicule, on peut lire : Ma classe Vehicule EST UN Moteur et EST AUSSI UNE Option...
public class Vehicule extends Moteur implements Option{
//....
}
Au lieu de Vehicule A UN Moteur et A UNE(ou N) Option
public class Vehicule {
Moteur mot;
List<Option> listOption;
}
le problème était justement au niveau du polymorphisme, mais c'est comme si sa ne marche pas avec les moteurs car l'appel du moteur me retourne null partout
pouvez vous avoir une idée ?
voici le code de la classe Moteur:
package com.vehicule.moteur;
import com.garage.vehicule.Vehicule;
public class Moteur {
protected TypeMoteur type;
protected String cylindre;
protected Double prix;
public void Moteur(String cylindre, double prix){
}
public String toString(){
String str= this.cylindre+","+this.type+","+this.prix;
return str;
}
public double getPrix() {
return this.getPrix();
}
public Moteur()
{
super();
}
public Moteur(TypeMoteur type, String cylindre, Double prix) {
super();
this.type = type;
this.cylindre = cylindre;
this.prix = prix;
}
}
Tout d'abord, je ne sais même pas si j'ai le droit de vous demander quelque chose. J'ai cliqué sur répondre, parce que je n'ai pas trouvé un bouton qui porte l'étiquette demander. Veuillez me pardonner l'usage mal à propos de ce site.
Maintenant, je m'occupe du travail pratique nommé réalisez un garage. J'ai trouvé plein d'autres questions à ce sujet, mais c'était difficile celle que je veux vous poser. Veuillez m'excuser dans le cas où elle a déjà été répondu.
Je ne vous donnerai pas de code à relire, parce que j'ai tout simplement besoin d'une explication au sujet de l'Interface Options et les classes GPS, BarreDeToit, VitreElectrique, Climatisation et SiègeChauffant.
Options est une Interface, donc les cinq classes ci-dessus doivent tous être abstraites. Or, dans le code Main que vous m'aviez fourni, il me semble qu'on essaie d'instancier GPS avec la ligne :
lag1.addOption(new GPS());
Ces choses semblent se contredire.Pour appuyer ce que j'avance, voici les avertissement qui s'affichent en bas de l'écran quand j'essaie de lancer :
Puis-je vous demander qu'est-ce qui cloche dans mon raisonnement? Y-a-til peut-être une astuce pour définir un « ajouteur » d'options sans qu'une erreur se déclenche lorsqu'on emploie le mot-clé new? Prévenez-moi si vous voulez voir un bout de mon code pour être à même de répondre.
Merci d'avance !
---------------------------
Mise à jour après la réponse de @Dcaszeros
Merci d'avoir répondu si rapidement! Si j'ai bien compris je dois opter pour une Interface ou une classe abstraite pour modéliser ces options. Comme je ne sais très peu des interfaces, les classes abstraites m'attirent le plus. Et dans ce cas vous me conseillez de mettre l'en-tête d'un constructeur dans cette classe abstraite, et de mettre ses corps dans ses classes-filles? Voilà ce que je pense quand vous me parlez d'une méthode qui permet d'instancier une classe: Le constructeur est à ma connaissance la seule qui fera l'affaire. Malheureusement, cette façon de couper un constructeur en deux ne semble pas marcher.
Comme vous avez beaucoup d'autres élèves sur les bras, je vous laisse le temps de les aider. Vous pouvez revenez ici quand bon vous semble, en attendant je lirai le prochain chapitre
En effet pour instancier, la classe ne doit pas être abstraite. L'interface Option associé à une classe permet d'attribuer aux objets qui l'implémentent une relation Is-a , tout comme une classe B qui hérite (extends) d'une classe A.
En fait, dans cet exercice t'aurais créé une classe Abstraite Option et créé les 5 autres classes filles et définir (ou implémenter) les méthodes abstraites de Option dans chacune d'elle, pour que celles ci soient instanciables...
ou bien
Utiliser l'interface Option :
c-a-d, créer des classes qui d'objets implémentent l'interface Option, et redéfinir les méthodes abstraites dans celle-ci...
La différence entre ces 2 méthodes, de mon niveau... je ne vois pas encore, mais j'aurais tendance à utiliser l'interface ^^, je vois bcp dans les forums , des developpers qui disent d'utiliser le moins possible l'héritage ! J'espère comprendre un jour !
J'ai un petit soucis pour finir le dernier devoir du MOOC java, tout fonctionne hormis la suppression des lignes dans la base de donnée qui me met une erreur du type:
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
Je vous met les parties de code concernés ...
la méthode delete de VehiculeDAO:
@Override
public boolean delete(Vehicule object) {
boolean isDone = false;
try {
connect.setAutoCommit(false);
// On efface chaque ligne d'option qui correspond à l'ID du véhicule:
ResultSet result = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE).executeQuery("SELECT * FROM vehicule_option");
while(result.next()) {
if(result.getInt("id_vehicule")==object.getId()) {
result.deleteRow();
System.out.println("Options effacés !");
}
}
result.close();
// Ensuite seulement on efface la ligne du véhicule:
result = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY).executeQuery("SELECT id FROM vehicule");
while(result.next()) {
if(result.getInt("id")==object.getId()) {
result.deleteRow();
System.out.println("Ligne avec clé principale supprimée !");
}
}
result.close();
isDone = true;
} catch (SQLException e) {
e.printStackTrace();
}
return isDone;
}
La méthode actionPerformed duButtonListener:
public void actionPerformed(ActionEvent event) {
id = Integer.parseInt(table.getModel().getValueAt(row, 4).toString());
Vehicule vehicule = new VehiculeDAO(HsqldbConnection.getInstance()).find(id);
if(new VehiculeDAO(HsqldbConnection.getInstance()).delete(vehicule)) {
System.out.println("Véhicule supprimé : " + vehicule.toString());
// Dans ce cas on recharge notre table:
this.table = DAOTableFactory.getTable(HsqldbConnection.getInstance(), DatabaseTable.VEHICULE);
this.table.revalidate();
this.table.repaint();
}
System.out.println("ID : " + id);
/*
Ici, il vous faut définir comment supprimer un véhicule
et n'oubliez pas de supprimer toutes les options de ceui-ci...
*/
Tout le code d'erreur de la console:
Options effacés !
Options effacés !
Options effacés !
Options effacés !
Options effacés !
java.sql.SQLException: attempt to assign to non-updatable column
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.notUpdatableColumn(Unknown Source)
at org.hsqldb.jdbc.JDBCResultSet.checkUpdatable(Unknown Source)
at org.hsqldb.jdbc.JDBCResultSet.performDelete(Unknown Source)
at org.hsqldb.jdbc.JDBCResultSet.deleteRow(Unknown Source)
at fr.ocr.sql.dao.VehiculeDAO.delete(VehiculeDAO.java:71)
at fr.ocr.ihm.listener.ButtonListener.actionPerformed(ButtonListener.java:35)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI$Handler.repostEvent(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI$Handler.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: org.hsqldb.HsqlException: attempt to assign to non-updatable column
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
... 53 more
ID : 18
Action sur le bouton 'Supprimer'
Colone de sélection : 6 | Ligne de sélection : 2
j'ai laisser les System.out.println() comme indices si ça peut aider.
Je n'ai pas trop de notions en SQL, je ne sais pas si l'erreur vient le la ou d'autre part, je vous serait très reconnaissant si vous pouviez m'aider, c'est la dernière ligne droite avant que je rende le devoir !
Au passage, un grand merci à l'auteur de ce cour, j'y ai appris énormément !
J'en suis au tp conversion celsius farhenheit et j'ai etablit un programme qui ne m'affiche pas d'erreur dans la fenêtre du projet. Ensuite lorsque je le lance j'entre les premieres variable etc, il m'affiche une erreur dans la console:
"Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(Unknown Source)
at siide1.main(siide1.java:32) "
Voici le programe entier:
import java.util.*;
public class siide1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double F, C, f1=1.8, f2=0.55555555555556;
int choix;
char reponse = ' ';
do{//tant que la réponse est O
do{ // tant que le choix n'est pas 1 ou 2
System.out.println("Choissisez le mode de conversion:" );
Wow! Je te jure que personne ne peux lire ça .Utilise la balise de code ,(bouton </> puis java)! Mais en gros Tu es sorti de ton tableau.
J'ai corrigé pour toi. J'ai ajouté quelque chose à la ligne 55(c'est expliqué pourquoi dans le cours je crois)
import java.util.*;
public class Test
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
double F, C, f1 = 1.8, f2 = 0.55555555555556;
int choix;
char reponse = ' ';
do
{//tant que la réponse est O
do
{ // tant que le choix n'est pas 1 ou 2
System.out.println("Choissisez le mode de conversion:");
System.out.println("1 - Convertisseur Celsius - Fahrenheit");
System.out.println("2 - Convertisseur Fahrenheit - Celsius");
choix = sc.nextInt();
} while (choix != 1 && choix != 2);
System.out.println("Température à convertir :");
double temp = sc.nextDouble();
if (choix != 2)
{
F = (f1 * temp) + 32;
System.out.println(temp + "°C correspond à :" + F + "°F");
} else
{
C = (temp - 32) * f2;
System.out.println(temp + "°F correspond à :" + C + "°C");
}
do
{ // tant que la réponse n'est pas O ou N
System.out.println("Souhaitez-vous convertir une autre température ?(O/N)");
sc.nextLine();
reponse = sc.nextLine().charAt(0);
} while (reponse != 'O' && reponse != 'N');
} while (reponse == 'O');
System.out.println("Au revoir...");
}
}
Rester des heures à chercher l'erreur et voir au final que c'est un truc tout bête... D'abord merci à toi kulturman, c'est surement expliquer dans le cours mais je ne le vois pas, pourrais tu m'expliquer pourquoi cela a t-il été nécessaire ici? (ici car dans son tp Cyrille Herby lui ne le met pas) Et qu'est ce que tu entend par je suis sorti de mon tableau?
Si vous avez invoqué une méthode comme nextInt(), nextDouble() et que vous invoquez directement après la méthode nextLine(), celle-ci ne vous invitera pas à saisir une chaîne de caractères : elle videra la ligne commencée par les autres instructions.
Donc nextline ne te renvoyait rien et toi tu essayais de récupérer le 1er caractère(t'es donc hors du tableau). Je ne sais pas si c'est assez clair.
Mis à part cette histoire de tête de lecture je crois que j'ai compris le reste.
En gros le fait d'avoir utilisé "nextDouble()" ne replace pas la tête de lecture au début de la ligne suivante (???) il faut donc le faire par la méthode "nextLine()" ce que je n'avais pas fait.
Du coup si j'ai bien compris mon erreur, Java n'a donc pas récupérer de chaine de caractère et étant donné que par la commande "charAt(0)" je voulais récupérer le 1er caractère de mon tableau (qui est ladite chaîne de caractère) , la boucle qui attend soit O soit N pour continuer se bloque car elle n'a aucun caractère pour vérifier cette condition, enfin je crois ...
Je voudrais demander des précisions sur l'énoncé du deuxième travail à soumettre pour le cours "Apprenez à programmer en Java":
Il est demandé d'ajouter une couche d'abstraction entre les tables et les objets. Or le code fournit contient déjà un niveau d'abstraction (DAOTableFactory), que doivent être les objectifs de la nouvelle couche d'abstraction? Est-ce qu'il s'agit de faire disparaitre les noms de table (DatabaseTable.MARQUE, etc) de l'IHM pour les remplacer par des collections d'objets Java plus typiques?
Je suis perplex au niveau de votre livre P66 utiliser et rechercher dans un tableau avec char tableauCaractere[] = {'a',b','c','d', 'e', 'f','g'}; cela fonctionne parfaitement j'ai compris. Mais j'ai essaye de l'utiliser avec String tableuChaine[] ={"jeanluc", "pierre", "michel"} etc.., j'ai remplace tous les chars par string dans le programme, or je ne comprends pas pourquoi le mot entrer au clavier il ne le retrouve pas ! alors pourquoi ? merci de votre reponse éventuelle.
× 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.
bonjour je n'obtient que les dernières ligne de la chaine dans le fichier des suggestions s'il vous plait