Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1

    Scrittura e Lettura File

    Ciao a tutti!
    Ho questo compito da fare:
    <<<Creare un archivio per memorizzare un'agenda telefonica>>>
    Si richiede di memorizzare il cognome, il nome e il numero di telefono.
    Il caricamento dei dati viene arrestato quando al posto del cognome
    viene digitato'*'.
    La memorizzazione dei dati viene effettuata su un file di testo in modo
    da rendere visibile l'archivio con un programma di editazione dei testi.
    Il cognome, il nome e il numero di telefono vengono memorizzati su
    una riga di testo e ognuno viene separato con il carattere ';'

    Ecco il mio codice:
    codice:
    import java.io.IOException;
    import java.util.Scanner;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.PrintWriter;
    
    public class Agenda {
        String cognome[], nome[], numTel[];
        int dim=100;
        int i;
        Scanner sc;
        
        void MemorizzoDati(){
            for(i=0;i<dim;i++){
                if("*".equals(cognome[i])){
                    SalvoNelFile();
                }
                else{
                System.out.print("Inserire il cognome: ");
                cognome[i]=sc.nextLine();
                System.out.print("Inserire il nome: ");
                nome[i]=sc.nextLine();
                System.out.print("Inserire il numero di telefono: ");
                numTel[i]=sc.nextLine();
                }
            }
        }
      
        public void SalvoNelFile(){
            FileWriter fileOut = null;
            PrintWriter fOut = null;
            try{
                fileOut = new FileWriter("dati.txt");
                fOut = new PrintWriter(fileOut);
                }
                catch(IOException e){
                System.out.println(e);
                System.exit(1);
                }
                for(i=0; i<dim; i++){
                    fOut.print(cognome[i] + ";" + nome[i] + ";" + numTel[i]);
                    fOut.println();
                }
                fOut.flush();
                try{
                    fileOut.close();
                }
                catch(IOException e){
                    System.out.println(e);
                    System.exit(1);
                }
        }
        
        void VizualizzaFile(){
            try{
                FileReader fileIn = new FileReader("dati.txt");
                while(sc.hasNextLine()){
                    System.out.println(sc.nextLine());
                }
                fileIn.close();
            }
            catch(IOException e){
                System.out.println(e);
            }
        }
        
    public class Main {
    
        public static void main(String[] args) {
            Agenda ag = new Agenda();
            ag.MemorizzoDati();
            ag.SalvoNelFile();
            ag.VizualizzaFile();
        }
    
    }
    
    }
    Quando lo eseguo mi dà questo errore:
    Exception in thread "main" java.lang.NullPointerException
    at agenda_telefonica.Agenda.MemorizzoDati(Agenda.java :40)
    at agenda_telefonica.Main.main(Main.java:7)
    Java Result: 1


    Insomma, il mio problema è che non capisco come mettere la condizione qui, in modo tale che non mi dia l'errore:
    codice:
    if("*".equals(cognome[i])){
                    SalvoNelFile();
                }
                else{
                System.out.print("Inserire il cognome: ");
                cognome[i]=sc.nextLine();
    Grazie a tutti in anticipo!
    Jan
    Storie, Pensieri & Riflessioni:
    http://storieriflessioni.blogspot.it/

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Scrittura e Lettura File

    Originariamente inviato da JanQuarius
    Quando lo eseguo mi dà questo errore:
    Exception in thread "main" java.lang.NullPointerException
    at agenda_telefonica.Agenda.MemorizzoDati(Agenda.java :40)
    at agenda_telefonica.Main.main(Main.java:7)
    Java Result: 1
    La prima questione: nel tuo codice si vede la dichiarazione degli array

    String cognome[], nome[], numTel[];

    ma non c'è la istanziazione effettiva degli array. Gli array sono oggetti, vanno istanziati con new tipo[dimensione] altrimenti quei reference restano a null.


    E inoltre, posso anche dirti questo. Essendo come dici un "compito", io immagino subito che stai seguendo un corso di studi su Java e che quindi stai ancora "imparando". Non so a quale livello sei ma vorrei segnalarti che il design della tua classe è abbastanza fumoso e critico (tanto per iniziare, devi gestire 3 array separati).

    Se non ti sono state date chiare e precise indicazioni su quante/quali classi definire e quindi ha un po' di libertà, io potrei suggerirti di creare:
    - una classe VoceAgenda che rappresenta una singola "voce" della agenda.
    - una classe Agenda che si occupa solo di gestire la struttura dati (aggiunta, rimozione, ecc.. di una voce) ma NON del input/output verso l'utente. Come struttura dati puoi utilizzare o un array o una collezione-lista (se conosci le collezioni) di oggetti VoceAgenda.
    - una classe IOAgenda per leggere e salvare da/su file i dati contenuti in una Agenda.
    - una classe GestioneAgenda che si occupa di richiedere l'input all'utente e di mostrare i dati.

    Certo, ci sarebbe da scrivere un po' di codice in più ma sarebbe molto più logico ed otterresti un ottimo risultato.

    Poi ovviamente vedi tu in base a quello che sai/devi fare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: Scrittura e Lettura File

    Originariamente inviato da andbin
    La prima questione: nel tuo codice si vede la dichiarazione degli array

    String cognome[], nome[], numTel[];

    ma non c'è la istanziazione effettiva degli array. Gli array sono oggetti, vanno istanziati con new tipo[dimensione] altrimenti quei reference restano a null.


    E inoltre, posso anche dirti questo. Essendo come dici un "compito", io immagino subito che stai seguendo un corso di studi su Java e che quindi stai ancora "imparando". Non so a quale livello sei ma vorrei segnalarti che il design della tua classe è abbastanza fumoso e critico (tanto per iniziare, devi gestire 3 array separati).

    Se non ti sono state date chiare e precise indicazioni su quante/quali classi definire e quindi ha un po' di libertà, io potrei suggerirti di creare:
    - una classe VoceAgenda che rappresenta una singola "voce" della agenda.
    - una classe Agenda che si occupa solo di gestire la struttura dati (aggiunta, rimozione, ecc.. di una voce) ma NON del input/output verso l'utente. Come struttura dati puoi utilizzare o un array o una collezione-lista (se conosci le collezioni) di oggetti VoceAgenda.
    - una classe IOAgenda per leggere e salvare da/su file i dati contenuti in una Agenda.
    - una classe GestioneAgenda che si occupa di richiedere l'input all'utente e di mostrare i dati.

    Certo, ci sarebbe da scrivere un po' di codice in più ma sarebbe molto più logico ed otterresti un ottimo risultato.

    Poi ovviamente vedi tu in base a quello che sai/devi fare.
    Grazie per i consigli. Sì sto imparando Java. Per quello che riguarda le vari classi che mi hai consigliato, beh adesso ho poco tempo e non riesco a farlo. No, le collezioni non so cosa sono, forse intendi creazioni di "array di oggetti", ma ho problemi anche con questi.
    L'ereditarietà non l'abbiamo ancora studiata, comunque so più o meno cosa sia, ma non ho l'idea pratica di cos'è XD.

    Comunque ho un po' corretto il codice e ho inizializzato gli array(mi ero scordato di farlo):
    codice:
    import java.io.IOException;
    import java.util.Scanner;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.PrintWriter;
    
    public class Agenda {
        String cognome[], nome[], numTel[];
        int dim=100;
        int i;
        Scanner sc;
        
        Agenda(){
            cognome = new String[dim];
            nome = new String[dim];
            numTel = new String[dim];
        }
        
        void MemorizzoDati(){
            for(i=0;i<dim;i++){
                if("*".equals(cognome[i])){
                    SalvoNelFile();
                }
                else{
                System.out.print("Inserire il cognome: ");
                cognome[i]=sc.nextLine();
                System.out.print("Inserire il nome: ");
                nome[i]=sc.nextLine();
                System.out.print("Inserire il numero di telefono: ");
                numTel[i]=sc.nextLine();
                }
            }
        }
      
        public void SalvoNelFile(){
            FileWriter fileOut = null;
            PrintWriter fOut = null;
            try{
                fileOut = new FileWriter("dati.txt");
                fOut = new PrintWriter(fileOut);
                }
                catch(IOException e){
                System.out.println(e);
                System.exit(1);
                }
                for(i=0; i<dim; i++){
                    fOut.print(cognome[i] + ";" + nome[i] + ";" + numTel[i]);
                    fOut.println();
                }
                fOut.flush();
                try{
                    fileOut.close();
                }
                catch(IOException e){
                    System.out.println(e);
                    System.exit(1);
                }
        }
        
        void VizualizzaFile(){
            try{
                FileReader fileIn = new FileReader("dati.txt");
                while(sc.hasNextLine()){
                    System.out.println(sc.nextLine());
                }
                fileIn.close();
            }
            catch(IOException e){
                System.out.println(e);
            }
        }
        
    }
    Purtroppo l'errore persiste lo stesso:

    Exception in thread "main" java.lang.NullPointerException
    at agenda_telefonica.Agenda.MemorizzoDati(Agenda.java :102)
    at agenda_telefonica.Main.main(Main.java:7)
    Inserire il cognome: Java Result: 1


    Se ci sono altri errori logici che notate, vi prego di farmeli notare
    Jan
    Storie, Pensieri & Riflessioni:
    http://storieriflessioni.blogspot.it/

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Qual è la riga precisa che solleva l'eccezione? Certi editor facendo doppio clic sul messaggio d'errore te la evidenziano.
    Perché leggo 102 ma non ha 102 righe.
    Gli oggetti di tipo String dell'array cognome sono inizializzati? Se la funzione che solleva l'eccezione è quella indicata nel messaggio d'errore l'unica cusa plausibile mi sembra quella.

  5. #5
    Originariamente inviato da Kaamos
    Qual è la riga precisa che solleva l'eccezione? Certi editor facendo doppio clic sul messaggio d'errore te la evidenziano.
    Perché leggo 102 ma non ha 102 righe.
    Gli oggetti di tipo String dell'array cognome sono inizializzati? Se la funzione che solleva l'eccezione è quella indicata nel messaggio d'errore l'unica cusa plausibile mi sembra quella.
    Sì è 102. Non la vedi perchè sopra c'è la pseudocodifica che non ho postato qui.
    Sì, è inizializzato l'oggetto.
    Storie, Pensieri & Riflessioni:
    http://storieriflessioni.blogspot.it/

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Non hai istanziato l'oggetto della classe Scanner.

    Il problema (anche se si sarebbe verificato anche in quelle successive) come vedevi dall'errore stava alla riga:

    codice:
    cognome[i]=sc.nextLine();
    Se ti dava NullPointerException uno dei due non era istanziato, e se non è zuppa è pan bagnato.

  7. #7
    Originariamente inviato da Kaamos
    Il problema (anche se si sarebbe verificato anche in quelle successive) come vedevi dall'errore stava alla riga:

    codice:
    cognome[i]=sc.nextLine();
    Se ti dava NullPointerException uno dei due non era istanziato, e se non è zuppa è pan bagnato.
    Ho corretto l'errore. Però ho un'altro piccolo, di logica. Quando vado ad eseguire il programma, questo metodo ... fa un ciclo infinito chiedendomi sempre - cognome, nome, numero di telefono, cognome, nome ... ecc :

    codice:
    void MemorizzoDati(){
            for(i=0;i<dim;i++){
                System.out.print("Inserire il cognome: ");
                cognome[i]=sc.nextLine();
                if("*".equals(cognome[i])){
                    SalvoNelFile();
                }
                System.out.print("Inserire il nome: ");
                nome[i]=sc.nextLine();
                System.out.print("Inserire il numero di telefono: ");
                numTel[i]=sc.nextLine();
                }
            }
    Non saprei come far sì che se il cognome prendesse in ingresso il pezzo di stringa "*", uscisse automaticamente dal metodo e richiamasse SalvoNelFile(); per far memorizzare subito i dati nel file di testo. Quello che ho fatto, in teoria dovrebbe funzionare, ma non funziona. Forse mi consigliate qualche altro ciclo(per esempio: "while" o "do/while"). Non so, prima avevo provato con do/while, ma mi dava errori.
    Grazie!
    Storie, Pensieri & Riflessioni:
    http://storieriflessioni.blogspot.it/

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da JanQuarius
    Non saprei come far sì che se il cognome prendesse in ingresso il pezzo di stringa "*", uscisse automaticamente dal metodo e richiamasse SalvoNelFile();
    basta un

    return;

    dopo SalvoNelFile();
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Grazie!
    Diciamo che ora il programma non funziona alla perfezione. Ha comunque degli errori che non riesco a comprendere. Ma il file di testo viene riempito con tutto quello che li dò in input:

    run:

    Inserire il cognome: Mattew
    Inserire il nome: Ronald
    Inserire il numero di telefono: 125487545
    Inserire il cognome: *
    BUILD STOPPED (total time: 24 seconds)


    Quindi finisce solo se fermo l'esecuzuine.

    Il file che viene creato e riempito è questo:

    codice:
    Mattew;Ronald;125487545
    ;;
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    Come far sì che il programma funzioni senza che io lo fermo?

    p.s. Scusa se troppe domande
    Storie, Pensieri & Riflessioni:
    http://storieriflessioni.blogspot.it/

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da JanQuarius
    Grazie!
    Diciamo che ora il programma non funziona alla perfezione. Ha comunque degli errori che non riesco a comprendere. Ma il file di testo viene riempito con tutto quello che li dò in input:

    run:

    Inserire il cognome: Mattew
    Inserire il nome: Ronald
    Inserire il numero di telefono: 125487545
    Inserire il cognome: *
    BUILD STOPPED (total time: 24 seconds)


    Quindi finisce solo se fermo l'esecuzuine.

    Il file che viene creato e riempito è questo:

    codice:
    Mattew;Ronald;125487545
    ;;
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    null;null;null
    Come far sì che il programma funzioni senza che io lo fermo?

    p.s. Scusa se troppe domande
    Non ho capito la domanda, se vuoi fare in modo che non compaiano tutti quei null devi inserire nel ciclo che scrive su file all'inizio del corpo del for:

    codice:
    if (cognome[i].equals("*")) break;

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.