Ciao a tutti,
sono nuovo del forum e spero che la discussione che sto aprendo rispetti le norme previste dal regolamento.
La mia difficoltà che vorrei sottoporvi è questa. Ho sviluppato un codice che calcola gli interessi che maturano su una somma iniziale per un dato interesse e un certo numero di anni. I dati che vengono forniti in input al programma sono proprio la somma iniziale, la percentuale di interesse e il numero di anni.Il metodo leggiDouble2 permette di incamerare la somma iniziale e la percentuale d'interesse verificando che essi si trovino in un determinato range (minimo;massimo). Il metodo leggiInt legge il numero di anni di giacenza della somma iniziale.
Per acquisire i dati da tastiera ho usato la classe scanner è ho creato l'oggetto tastiera.
L'esecuzione del programma non da problemi ma il debugger di Eclipse mi segnala due warnings con la scritta "Resource leak: 'tastiera' is never closed".
Ho fatto una ricerca su internet e ho trovato che, per ovviare a questo problema, alla fine del codice bisogna 'chiudere' l'oggetto di tipo scanner con nomeoggetto.close().
Ho quindi aggiunto al codice le righe 18 e 45 tastiera.close();
In effetti i warnings scompaiono ma il il programma durante l'esecuzione va in errore e non funziona più. Mi viene segnalata la seguente eccezione:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at prova1.leggiDouble2(prova1.java:36)
at prova1.main(prova1.java:68)
Potete aiutarmi ? Vorrei lasciare intatta o quasi la struttura del codice, come posso correggere questo tipo di problema ? Ecco il codice:
codice:
//import java.io.*;//import java.util.InputMismatchException;
import java.util.Scanner;
public class prova1 {
static int leggiInt(String messaggio)//lettura numero anni di giacenza
{
System.out.print(messaggio);
Scanner tastiera = new Scanner(System.in);
while ( !tastiera.hasNextInt() )
{
System.out.println("Inserire un *numero INTERO*");
tastiera.nextLine(); //consumo dato sbagliato
}
//tastiera.close();
return tastiera.nextInt();
}
public static double leggiDouble2(String messaggio, double minimo, double massimo)/*lettura somma iniziale o percentuale interesse*/
{
double num=0;
Scanner tastiera = new Scanner(System.in);
do//controllo tipo di input
{
System.out.println(messaggio);
while (!tastiera.hasNextDouble())
{
System.out.println("Inserire un numero!");
System.out.println(messaggio);
tastiera.nextLine();
}
num = tastiera.nextDouble();
if (num < minimo || num>massimo)/*verifica se il valore inserito ricade all'interno del range prefissato*/
System.out.println("Valore non accettabile ("+minimo+"-"+massimo+")");
} while (num < minimo || num>massimo);
//tastiera.close();
return num;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
/* dati input
* somma iniziale
* percentuale di interesse annuale
* numero di anni deposito
*
* */
double sommaIniziale = 0;
double sommaFinale = 0;
double percentualeInteresse = 0;
int anniDeposito = 0;
sommaIniziale = leggiDouble2("Inserire somma iniziale: ", 100, 2000);/*chiamata a leggiDouble2*/
percentualeInteresse = leggiDouble2("Inserire percentuale annuale di interesse: ", 2.5, 10.5);/*chiamata a leggiDouble2*/
anniDeposito = leggiInt("Durata in anni del deposito: ");/*Chiamata a leggiInt*/
sommaFinale = sommaIniziale;
while(anniDeposito>0)
{
sommaFinale = sommaFinale+ sommaFinale/100 * percentualeInteresse;/*formula per il calcolo dell'interesse composto*/
anniDeposito = anniDeposito -1;
}
System.out.println("Hai ora in banca: " + sommaFinale +" euro :)");
System.out.println("Fine programma ...");
}
}