Newsgroup: it.comp.java
Titolo: Errore dichiarazioni variabili

Salve,
vorrei chiedere il vostro aiuto per uno script semplicissimo che esegue 
un calcolo altrettanto semplice.
Il problema è il seguente: nonostante abbia dichiarato tutte le 
variabili all'inizio, il compilatore dice che una di esse non risulta 
dichiarata (benchè lo sia).
Il codice è il seguente:
public class Calcolo {
          public static void main (String args[]) {
         double importo;
         double parziale1;
         double parziale2;
         double parziale3;
         double risultato1;
         double risultato2;
         double risultato3;
         System.out.println("Introdurre l'importo da suddividere tra gli 
utenti:");
         try {
            importo = System.in.read();
         }
         catch (Exception e) {
            System.out.println("Errore: " + e.toString());
         }
         parziale1 = 23.84 * (importo) / 74;
         risultato1 = (parziale1) / 2;
         parziale2 = 24.5 * (importo) / 74;
         risultato2 = (parziale2) / 2;
         parziale3 = 25.66 * (importo) / 74;
         risultato3 = (parziale3) / 2;
         System.out.println("Utente 1 paga " + risultato1);
         System.out.println("Utente 2 paga " + risultato2);
         System.out.println("Utente 3 paga " + risultato3);
    }
}
Grazie a chiunque vorrà rispondere.
RS

 dichiarata (benchè lo sia).
quale variabile?
-- 
Andrea Francia
http://www.andreafrancia.it/

 quale variabile?
importo
RS


in quale riga?
Incolla l'output del compilatore.


         }
Nel caso di una exception, "importo" non viene inizializzata. Infatti 
nel blocco "catch" ti limiti a stampare la exception e andare avanti 
nell'esecuzione.


Ho compilato il tuo codice, l'errore è questo:
C:\Documents and 
Settings\Andrea\Documenti\NetBeansProjects\JavaApplication8\src\javaapplication8\NewClass.java:31: 
variable importo might not have been initialized
         parziale1 = 23.84 * (importo) / 74;
1 error
BUILD FAILED (total time: 1 second)
L'errore non ha a che fare con il fatto che non hai dichiarato la 
variabile ma con il fatto che potrebbe non essere inizializzata.
Il problema è dove hai posizionato il catch.
Se viene lanciata una IOException i conti sarebbero comunque eseguti 
però senza che importo sia stato inizializzato.
Ti correggo il codice
public class Calcolo {
          public static void main (String args[]) {
         double importo;
         double parziale1;
         double parziale2;
         double parziale3;
         double risultato1;
         double risultato2;
         double risultato3;
         System.out.println("Introdurre l'importo da suddividere tra gli 
utenti:");
         try {
            importo = System.in.read();
            parziale1 = 23.84 * (importo) / 74;
            risultato1 = (parziale1) / 2;
            parziale2 = 24.5 * (importo) / 74;
            risultato2 = (parziale2) / 2;
            parziale3 = 25.66 * (importo) / 74;
            risultato3 = (parziale3) / 2;
            System.out.println("Utente 1 paga " + risultato1);
            System.out.println("Utente 2 paga " + risultato2);
            System.out.println("Utente 3 paga " + risultato3);
         }
         catch (Exception e) {
            System.out.println("Errore: " + e.toString());
         }
    }
}
Consiglio: quando chiedi aiuto su un programma che non compila incolla 
sempre l'output del compilatore.


 Incolla l'output del compilatore.
Calcolo.java:20: variable importo might not have been initialized
         parziale1 = 23.84 * (importo) / 74;
                              ^
1 error
RS

            importo = System.in.read();
Questo non fa quello che pensi, la righe giuste sono:
             BufferedReader reader = new BufferedReader(System.in);
             String line = reader.readLine();
             importo = Integer.parseInt(line);


 
Grazie di tutto. Mi ero già accorto che c'era qualcosa che non andava 
dal momento che il mio codice originario restituisce (quasi) lo stesso 
risultato a prescindere dal valore in input.
L'unica cosa è che il compilatore adesso restituisce quanto segue:
Calcolo.java:14: cannot find symbol
symbol  : class BufferedReader
location: class Calcolo
            BufferedReader reader = new BufferedReader(System.in);
            ^
Calcolo.java:14: cannot find symbol
symbol  : class BufferedReader
location: class Calcolo
            BufferedReader reader = new BufferedReader(System.in);
                                        ^
2 errors
RS

 RS
Non so che compilatore usi tu ma il mio dice "The local variable importo 
may not have been initialized" che vuol dire tutt'altra cosa .
Ti dice che nel caso scatti l'eccezione "importo" potrebbe non essere 
stata valorizzata. L'errore scompare se nella dichiarazione inizializzi 
le variabili. Poi scusa... nel catch... c'è un errore e tu continui 
l'elaborazione?
Ciao

 2 errors
Scusa non ti ho detto che devi mettere
import java.io.BufferedReader;
all'inizio del file.


 l'elaborazione?
Anche questo è vero, come Andrea Francia ha gentilmente corretto. 
Tuttavia credo che l'errore risieda altrove dal momento che il programma 
produce sempre gli stessi risultati a prescindere dai valori in ingresso.
RS

 
L'avevo immaginato, per questo avevo aggiunto all'inizio:
import java.io.*;
e l'output è diventato:
C:\Programmi\Java\jdk1.6.0_02\bin>javac Calcolo.java
Calcolo.java:16: cannot find symbol
symbol  : constructor BufferedReader(java.io.InputStream)
location: class java.io.BufferedReader
            BufferedReader reader = new BufferedReader(System.in);
                                    ^
1 error
RS


Ops, mi sono dimenticato un pezzo:
   BufferedReader reader = new BufferedReader(new 
InputStreamReader(System.in));
   String line = reader.readLine();
   importo = Integer.parseInt(line);
Stavolta ho compilato e eseguito il codice, quindi sono sicuro.


 
Infatti adesso funziona a meraviglia, persino con l'output corretto! :-D
Grazie un milione, sei stato di grandissimo aiuto.
RS

Stai imparando Java?
Che libro stai seguendo?


 
Java 1.1 - Tutto e Oltre
Apogeo
E' un po' datato ma io parto da zero come avrai ben capito, quindi...
RS


Usando un libro così datato corri il rischio di imparare ad usare metodi 
ormai deprecati.
E poi non ti insegna le features del Java 1.5: il for-each, gli enum e i 
generics.
Non ti dico di cambiare libro ma tieni conto di questi fatti.
Buono studio.


Me ne rendo perfettamente conto. Il fatto è che sono laureato in fisica 
e prima ancora di affacciarmi a Java ho dovuto studiare la 
programmazione orientata agli oggetti tout-cour (...e nessuna delle due 
materie viene insegnata nel mio corso di laurea), quindi già riuscire a 
scrivere un banale programma che compila è tutto grasso che cola! :-D
Un'ultima cosa riguardo al codice di prima; vedo che non accetta numeri 
decimali in ingresso. Non è che sia una cosa importantissima: è 
possibile farglieli accettare cambiando qualche attributo o dovrei 
riscrivere buona parte del programma?
Di nuovo.
RS


Al posto di int usa double.
Al posto di Integer.parseInt() usa Double.parseDouble().
Altro consiglio: aggiungi la riga
	System.out.println("Importo:" + importo);
Che ti dice il valore letto, giusto per scoprire subito i problemi tipo 
quello di prima dove usavi System.in.read().
Altra cosa importante: hai già capito dove trovi tutta la documentazione 
delle classi Java?
http://java.sun.com/javase/6/docs/api/
Quando vuoi trovare la documentazione di una certa classe per trovarla 
ti basta cercare su google il testo
	NomeClasse se 6
Il pezzo "se 6" aiuta google a darti come risultato quello relativa 
all'ultima versione di Java (la 6 appunto).
