IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Fichiers séquentiels et bad operand type


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Escrimeur
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Angola

    Informations professionnelles :
    Activité : Escrimeur

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Fichiers séquentiels et bad operand type
    A que bonjour.
    Je viens de faire un exercice sur l'utilisation de fichiers séquentiels je l'ai fais d'instinct, et il faudra que je me repenche dessus, il y a certains problème auxquels j'ai réfléchi et que je ne comprend pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     public static int newCustomerNumber() //This method must return a result of type int
    	{
            int maxCustomerNumber= 0, customerNumberRead;
            String nameRead,surnameRead;
            try
          {
    		FileReader customersFile=new FileReader("c\\customers.txt");
    		BufferedReader br=new BufferedReader(customersFile);
    		while((nameRead=br.readLine())!=null)
    		{
    			surnameRead=br.readLine();
    			customerNumberRead=Integer.parseInt(br.readLine());
    			if(customerNumberRead>maxCustomerNumber)
    			{
    				maxCustomerNumber=customerNumberRead;
    			}
    	    }
    		customersFile.close();
    		return maxCustomerNumber+1; // C'est pas un int ça?
     
    	  }catch(Exception e) {System.out.println(e.getMessage());}
     
        }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public static int newBillNumber()
    	{
            int maxBillNumber= 0, billNumberRead, billCustomerNumberRead;
            float billSumRead;
            String billDateRead;
            try
          {
    		FileReader billsFile=new FileReader("c\\bills.txt");
    		BufferedReader br=new BufferedReader(billsFile);
    		while((billNumberRead=Integer.parseInt(br.readLine()))!=null)
    // The operator != is undefined for the arguments types int,null. Je comprend pourquoi ça marche pas avec int mais comment faire pour que ça marche?
    		{
    			billSumRead=Float.parseFloat(br.readLine());
    			billDateRead=br.readLine();
    			billCustomerNumberRead=Integer.parseInt(br.readLine());
    			if(billNumberRead>maxBillNumber)
    			{
    				maxBillNumber=billNumberRead;
    			}
    	    }
    		return maxBillNumber+1;
    		billsFile.close();
    	  }catch(Exception e) {System.out.println(e.getMessage());}
     
        }
    Dans l'attente de vos réponses illuminées...

    PS:Voici le code intégral à titre indicatif n'y jeté un œil que s'y vous avez foi en l’humanité: c'est probablement foireux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
     
    package exo_17;
    import javax.swing.*;
    import java.io.*;
     
    public class exo_17 {
     
    	public static void main(String[] args)
    	{
    		try
    		{
    		FileWriter customersFile=new FileWriter("c:\\customers.txt");
    		customersFile.close();
    		FileWriter billsFile=new FileWriter("c:\\bills.txt");
    		billsFile.close();
    		}catch(Exception e){System.out.println(e.getMessage());}
    		menu();
    	}
     
    	public static void menu()
    	{
    		byte choixMenu;
    		String name, surname,billDate;
    		float billSum;
     
    		choixMenu=Byte.parseByte(JOptionPane.showInputDialog(null,"1-Ajouter un client"+"\r\n"+"2-Ajouter une facture"+"\r\n"+"3-Bilan Factures"+"\r\n"+"4-Quitter"+"\r\n"+"Saisissez votre choix:"));
    		while(choixMenu!=4)
    		if(choixMenu==1)
    		{
    			name=JOptionPane.showInputDialog("Saisissez le nom du client:");
    			surname=JOptionPane.showInputDialog("Saisissez le prénom du client:");
    			addCustomer(name,surname);
    			choixMenu=Byte.parseByte(JOptionPane.showInputDialog(null,"1-Ajouter un client"+"\r\n"+"2-Ajouter une facture"+"\r\n"+"3-Bilan Factures"+"\r\n"+"4-Quitter"+"\r\n"+"Saisissez votre choix:"));
     
    		}
    		else if(choixMenu==2)
    		{
    			name=JOptionPane.showInputDialog("Saisissez le nom du client à facturer:");
    			surname=JOptionPane.showInputDialog("Saisissez le prénom du client à facturer:");
    			billDate=JOptionPane.showInputDialog("Saisissez la date de la facture:");
    			billSum=Integer.parseInt(JOptionPane.showInputDialog("Saisissez le montant de la facture:"));
    			addBill(getCustomerNumber(name,surname),billDate,billSum);
    			choixMenu=Byte.parseByte(JOptionPane.showInputDialog(null,"1-Ajouter un client"+"\r\n"+"2-Ajouter une facture"+"\r\n"+"3-Bilan Factures"+"\r\n"+"4-Quitter"+"\r\n"+"Saisissez votre choix:"));
    		}
    		else if(choixMenu==3)
    		{
    			showAllCustomersBills();
    			choixMenu=Byte.parseByte(JOptionPane.showInputDialog(null,"1-Ajouter un client"+"\r\n"+"2-Ajouter une facture"+"\r\n"+"3-Bilan Factures"+"\r\n"+"4-Quitter"+"\r\n"+"Saisissez votre choix:"));
     
    		}
    		else
    		{
    			System.out.println("Au revoir!");
    			System.exit(0);
    		}
    	}
     
    	public static int getCustomerNumber(String name, String surname)
    	{
    		int customerNumberRead;
    		String nameRead,surnameRead;
    		try
    		{	
    			FileReader customersFile=new FileReader("c\\customers.txt");
    			BufferedReader br=new BufferedReader(customersFile);
    			while((nameRead=br.readLine())!=null)
    			{
    				surnameRead=br.readLine();
    				customerNumberRead=Integer.parseInt(br.readLine());
    				if(nameRead.compareTo(name)==0 && surnameRead.compareTo(surname)==0)
    					return customerNumberRead;
    			}
    			customersFile.close();
    			}catch(Exception e) {System.out.println(e.getMessage());}
    		return-1 ;
    	}
     
    	public static int newCustomerNumber()
    	{
            int maxCustomerNumber= 0, customerNumberRead;
            String nameRead,surnameRead;
            try
          {
    		FileReader customersFile=new FileReader("c\\customers.txt");
    		BufferedReader br=new BufferedReader(customersFile);
    		while((nameRead=br.readLine())!=null)
    		{
    			surnameRead=br.readLine();
    			customerNumberRead=Integer.parseInt(br.readLine());
    			if(customerNumberRead>maxCustomerNumber)
    			{
    				maxCustomerNumber=customerNumberRead;
    			}
    	    }
    		customersFile.close();
    		return maxCustomerNumber+1;
     
    	  }catch(Exception e) {System.out.println(e.getMessage());}
     
        }
     
    	public static int newBillNumber()
    	{
            int maxBillNumber= 0, billNumberRead, billCustomerNumberRead;
            float billSumRead;
            String billDateRead;
            try
          {
    		FileReader billsFile=new FileReader("c\\bills.txt");
    		BufferedReader br=new BufferedReader(billsFile);
    		while((billNumberRead=Integer.parseInt(br.readLine()))!=null)
    		{
    			billSumRead=Float.parseFloat(br.readLine());
    			billDateRead=br.readLine();
    			billCustomerNumberRead=Integer.parseInt(br.readLine());
    			if(billNumberRead>maxBillNumber)
    			{
    				maxBillNumber=billNumberRead;
    			}
    	    }
    		return maxBillNumber+1;
    		billsFile.close();
    	  }catch(Exception e) {System.out.println(e.getMessage());}
     
        }
     
    	public static int addCustomer(String name,String surname)
    	{
    		int customerNumberRead, customerNumber=newCustomerNumber();
            String nameRead,surnameRead;
    		boolean customerExist=false;
    		try
    		{
    			FileReader customersFile=new FileReader("c:\\customers.txt");
    			BufferedReader br=new BufferedReader(customersFile);
    			while((nameRead=br.readLine())!=null)
    			{
    			    surnameRead=br.readLine();
    				customerNumberRead=Integer.parseInt(br.readLine());
    				if(nameRead.compareTo(name)==0 && surnameRead.compareTo(surname)==0)
    				{
    					JOptionPane.showMessageDialog(null, "Ce client existe déjà.");
    					customerExist=true;
    					return customerNumberRead;
     
    				}
    			}
    			customersFile.close();
    		}catch(Exception e) {System.out.println(e.getMessage());}
     
    			if(customerExist=false)
    			{
    				try
    			  {
    			FileWriter customersFile=new FileWriter("c:\\customers.txt",true);
    			customersFile.write(name+"\r\n");
    		    customersFile.write(surname+"\r\n");
    		    customersFile.write(customerNumber+"\r\n");
    		    customersFile.close();
    		    return customerNumber;
    			  }catch(Exception e) {System.out.println(e.getMessage());}
    			}
    	}
     
    	public static void addBill(int billCustomerNumber, String billDate, float billSum)
    	{
    		int billNumber=newBillNumber();
    		try
    		{
    			FileWriter billsFile=new FileWriter("c:\\customers.txt",true);
    			billsFile.write(billNumber+"\r\n");
    			billsFile.write(billSum+"\r\n");
    			billsFile.write(billDate+"\r\n");
    			billsFile.write(billCustomerNumber+"\r\n");
    			billsFile.close();
    		}catch(Exception e){System.out.println(e.getMessage());}
    	}
     
    	public static void addBillData(String name, String surname,String billDate,float billSum)
    	{
     
    	}
     
    	public static void showAllCustomersBills()
    	{
    		int billNumber, customerNumber,billCustomerNumber, billNumberRead, customerNumberRead, billCustomerNumberRead;
            String name, surname, billDate, nameRead,surnameRead, billDateRead;
    		float billSum, totalBillsSum=0, billSumRead;
    		try
    		{
    			FileReader customersFile=new FileReader("c:\\customers.txt");
    			BufferedReader br=new BufferedReader(customersFile);
    			while((nameRead=br.readLine())!=null)
    			{
    			    surnameRead=br.readLine();
    				customerNumberRead=Integer.parseInt(br.readLine());
    				try
    				{
    					FileReader billsFile=new FileReader("c:\\bills.txt");
    					BufferedReader br2=new BufferedReader(billsFile);
    					while((billNumberRead=Integer.parseInt(br2.readLine()))!=null)
    					{
    						billSumRead=Float.parseFloat(br.readLine());
    						billDateRead=br.readLine();
    						billCustomerNumberRead=Integer.parseInt(br.readLine());
    						if(billCustomerNumberRead==customerNumberRead)
    						{
    							totalBillsSum+=billSumRead;
    						}
    					}
    					billsFile.close();
    					System.out.println("surnameRead"+" "+"nameRead: "+totalBillsSum+"$");
    					totalBillsSum=0;
    				}catch(Exception e){System.out.println(e.getMessage());}
    		    }
    			customersFile.close();
    	}catch(Exception e){System.out.println(e.getMessage());}	
       }     
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    1) Une méthode dont le type de retour est int doit toujours retourner un int, dans tous les cas
    Dans tes méthodes, en cas d'exception, il y a un catch() dans lequel on affiche le message de l'exception, mais la méthode ne retourne rien dans ce cas : d'où erreur de compilation

    2) Cette ligne ne peut pas compiler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((billNumberRead=Integer.parseInt(br.readLine()))!=null
    billNumberRead est un int, qui ne peut être comparé à null.

    Pour résoudre ça il faut utiliser une variable String pour récupérer le résultat de readLine(), comparable à null, et ensuite faire la conversion de cette String vers int dans la boucle.

    Sinon, penses toujours à fermer un flux dans tous les cas également (donc même en cas d'exception, qui va directement au catch() sans exécuter le close()) : oit utiliser un finally, soit un try-catch-withresource. Par ailleurs, utiliser printStackTrace() pour afficher la stack trace d'une exception donne toujours plus d'informations que d'afficher juste le message de l'exception, ce qui te facilitera le débogage le cas échéant.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Escrimeur
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Angola

    Informations professionnelles :
    Activité : Escrimeur

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Gestion des exceptions.
    Bon le premier soucis est réglé par contre j'ai pas encore eu mes cours sur la gestion des exception, du coup j'ai lu quelque post sur internet mais je suis pas sur de comprendre:
    -Les instructions dans finally s’exécutent dans tous les cas,qu'il y ait une exception ou pas?
    -Comment fermer le fichier si le catch s’exécute? J'ai essayé de mettre customersFile.close(); dans catch et/ou dans finally mais 'customersFile cannot be resolved'.
    -On m'indique l'avertissement finally block does not complete normally.
    Au rivoir.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public static int newCustomerNumber()
    	{
            int maxCustomerNumber= 0, customerNumberRead;
            String nameRead,surnameRead;
            try
          {
    		FileReader customersFile=new FileReader("c\\customers.txt");
    		BufferedReader br=new BufferedReader(customersFile);
    		while((nameRead=br.readLine())!=null)
    		{
    			surnameRead=br.readLine();
    			customerNumberRead=Integer.parseInt(br.readLine());
    			if(customerNumberRead>maxCustomerNumber)
    			{
    				maxCustomerNumber=customerNumberRead;
    			}
    	    }
    		customersFile.close();
    		return maxCustomerNumber+1;
    	  }
            catch(Exception e) 
            {
    		  e.printStackTrace();
    	}
            finally
            {
            	return maxCustomerNumber+1; 
            }   
        }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pour afficher la stack trace d'une exception, il suffit d'appeler la méthode printStackTrace() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch( MachinException e ) {
       e.printStackTrace();
    }
    S'affichera alors le message de l'exception, plus toutes les lignes de code appelées jusqu'à l'exception, de la dernière à la première dans le thread courant, composée du nom de la méthode, du nom de la classe, du nom du fichier associé, et du numéro de ligne : des informations utiles pour savoir ce qu'il se passe et où.

    La technique du block finally pour fermer un flux, ou autre classe qui a une méthode de type close() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    XXX instance=null; // XXX est une classe du type InputStream, OutputStream, Writer, Reader...  la variable doit être déclarée en dehors du bloc try pour être disponible dans le bloc finally
    try{
        instance = new ...// ouverture du flux 
     
        ... traitement
     
    }
    finally {
       if ( instance!=null ) { // en cas d'erreur à la création, l'instance ne sera pas créée et donc la variable contiendra null
          instance.close();
       }
    }
    Je n'ai pas mis le traitement des exceptions dans cet exemple, parce qu'on peut le traiter de différentes manières (par throws ou par catch unique, ou catch multiple).

    La technique du try-with-resource utilise une syntaxe particulière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try ( XXX instance = ...  ) { //ouverture du flux (notes les parenthèses)
     
         ... // traitement
     
    }
    Les instances qui peuvent être créées entre parenthèses doivent être l'implémentation d'une classe qui implémente AutoCloseable. A la fin du bloc try, la méthode close() de toutes ces instances sera appelée automatiquement.

    Enfin, oui, le code dans le bloc finally s'exécute toujours (en cas d'exception, mais aussi de return par exemple), après le dernier code qui s'exécute dans le bloc try.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,




    Pour la libération des ressources, je conseillerais plutôt le pattern suivant plus simple à mettre en œuvre et moins casse-gueule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 1. Création de la ressource. Si une exception survient on zappe tout (de toute manière on n'a rien à fermer).
    final XXX instance = new XXX();
    // 2. On ouvre un bloc try/finally immédiatement après
    try {
     
        // 3. Traitement sur le flux
     
    } finally {
        // 4. Fermeture du flux (pas besoin de tester le null)
        instance.close();
    }
    Je conseillerais aussi de laisser remonter l'exception, mais si on doit les traiter il faut utiliser un bloc try/catch qui englobe le tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try {
        final XXX instance = new XXX();
        try {
            ...
        } finally {
            instance.close();
        }
    } catch (Exception e) {
        // Le traitement de l'exception
    }

    De même si on a plusieurs ressources il faut répéter le pattern pour chaque ressource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    final XXX instance1 = new XXX();
    try {
        final YYY instance2 = new YYY();
        try {
            // code qui utilise instance1 et instance2
        } finally {
            instance1.close();
        }
    } finally {
        instance2.close();
    }


    Ca peut paraitre anodin mais c'est bien plus simple à gérer car en respectant cela il n'y a pas de cas particulier.
    D'ailleurs c'est le pattern utilisé par le try-with-ressource de Java 7...






    Sinon perso pour les exceptions je déconseille les truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch( MachinException e ) {
       e.printStackTrace(); // ou System.out.println(e) ou log(e), etc.)
    }
    Ca veut dire que lorsqu'il y a un problème, je l'affiche sur la console... mais je continue comme si de rien n'était.
    Dans la majorité des cas cela va juste entrainé une autre exception derrière... ce qui va juste retarder le moment où le programme va planter.
    Ou alors mettre le programme dans un état incohérent... ce qui risque de poser toute sorte de problème !


    Pour traiter les exceptions, il y a 2 cas :
    • Tu sais que l'exception peut survenir dans un cas "normal", et tu peut mettre en place une solution alternative.
      Dans ce cas tu peux utiliser un try/catch pour effectuer ce traitement alternatif.
    • Le cas ne devrait pas se produire dans un cas "normal", et à la rigueur il vaut mieux laisser remonter l'exception.
      Ainsi lorsque si le cas survient malgré tout, on a une exception qui fait planter le programme (mais au moins on a directement le stacktrace correspondant à l'erreur).

    Le seul problème c'est que les exception sont "checked", et que cela obligera alors à la traiter lors de l'appel de la méthode. On peut pallier à cela en l'englobant dans une RuntimeException (ou une exception fille plus spécifique) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

    @Booniak : dans ton code en cas d'erreur de lecture, la méthode newCustomerNumber() va renvoyer "1".
    C'est normal ?


    Sinon le bloc finally ne devrait pas utiliser l'instruction return, car cela peut cacher d'autres exceptions.
    Par exemple cette méthode génère une ArithmeticException "division by zero" une lorsqu'on l'utilise avec "0" en second paramètre.
    Mais cette exception est ignoré et la méthode retourne "normalement" 0, la valeur initiale de la variable "result" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public static int method(int a, int b) {
    		int result = 0;
    		try {
    			result = a / b;
    		} finally {
    			return result;
    		}
    	}

    a++

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Escrimeur
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Angola

    Informations professionnelles :
    Activité : Escrimeur

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bon tout ces trucs d'exception restent très abstrait pour moi, je me rendrais mieux compte en les manipulant dans différentes situations.
    Et oui dans l'exemple précédent c'était normal que la méthode newCustomerNumber() renvoi 1.
    Mais du coup vu que je peux pas mettre de return dans finally j'essaye de le mettre dans les instructions de catch mais ça crée une erreur unreachable code, je comprend cette erreur tel que:
    le return present dans les instructions de try est forcement exécuté et du coup la méthode est terminé...
    Dooooooonc comment faire pour return quelque chose de différent en cas d'exception ???


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    	public static int newBillNumber()
    	{
            int maxBillNumber= 0, billNumberRead, billCustomerNumberRead;
            float billSumRead;
            String billDateRead;
          try
           {
            final FileReader billsFile=new FileReader("c\\bills.txt");
              try
               {
    		     BufferedReader br=new BufferedReader(billsFile);
    		    while((billDateRead=br.readLine())!=null)                     
    		      {
    			    billSumRead=Float.parseFloat(br.readLine());
    			    billNumberRead=Integer.parseInt(br.readLine());
    			    billCustomerNumberRead=Integer.parseInt(br.readLine());
    			     if(billNumberRead>maxBillNumber)
    			       {
    				    maxBillNumber=billNumberRead;
    			       }
    	           }
    		        return maxBillNumber+1;
    	        }
                finally
                  {
        		    billsFile.close();
                  }
           }
             catch(IOException e) 
               { 
            	throw new RuntimeException(e);
            	return maxBillNumber+1;
               }  
        }
    Bonne nuit, peut-être qu'une nuit de sommeil me donnera une révélation toussa toussa..

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Booniak Voir le message
    Mais du coup vu que je peux pas mettre de return dans finally j'essaye de le mettre dans les instructions de catch mais ça crée une erreur unreachable code, je comprend cette erreur tel que:
    le return present dans les instructions de try est forcement exécuté et du coup la méthode est terminé...
    Du tout. C'est juste que juste avant le return, tu as mis un throw. Et donc rien ne peut s'exécuter après le throw, donc ça sert à rien de mettre quelque chose après.

    Citation Envoyé par Booniak Voir le message
    Dooooooonc comment faire pour return quelque chose de différent en cas d'exception ???
    Dans ce cas-là il ne faut pas faire de throw.

    Mais bien sûr, en principe quand on connaît bien, il faut vraiment laisser l'exception se lancer, ce qui veut dire qu'il n'y a pas de return à faire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Escrimeur
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Angola

    Informations professionnelles :
    Activité : Escrimeur

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bon je suis venu a bout de l'exercice, même si je suis loin de saisir les subtilités de la gestion d'exception, je vous remercie tous pour vos réponses et je vous dis à la prochaine pour de nouvelles aventures...vers l'infini et le Ghana!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation d'un ArrayList : "bad operand type [...]"
    Par rco69 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 23/04/2015, 09h44
  2. Inversion tableau( bad operand type)
    Par Booniak dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 08/08/2014, 18h50
  3. [VB]Lire fichier séquentiel
    Par nightwish dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/01/2006, 08h05
  4. fichiers séquentiels indexés VS base de données relationnell
    Par Clotilde dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 22/08/2005, 06h31
  5. [Fichiers séquentiels] compatibilité Delphi <-> C++
    Par soccersoft dans le forum Langage
    Réponses: 2
    Dernier message: 08/07/2004, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo