Syntax error on token ";", , expected

di il
7 risposte

Syntax error on token ";", , expected

Salve,

premetto che sono all'inizio con JAVA e ECLIPSE,

ho preso un esempio è ho fatto qualche modifica…

non capisco perché ho questo errore in fase di compilazione:

Syntax error on token ";", , expected

su:

int[] voti;

grazie anticipatamente… questo è il codice:

import java.util.Scanner;

public class ProvaStudenti
{	
    public static void main(String[] a) 
    {
    	Scanner tastiera = new Scanner(System.in);
    	
    	class Studente {
    		String nome;
    		
    		int[] voti;
    		
    		voti = new int[3];
    		
    		double mediaVoti() {
    			int somma = 0;
    			double media = 0.0;
    			
    			somma = voti[0] + voti[1] + voti[2];
    			
    			media = (double)somma / 3;
    			
    			return media;
    		}
    	}
    	
	// dichiaro che la variabile stdA e' di tipo Studente:
	Studente stdA;

	// costruisco l'oggetto stdA:
	stdA = new Studente();

	//inizializzo stdA:
	System.out.println("Inserisci nome A");
	
	stdA.nome = tastiera.nextLine();
	
	for (int i=0; i<3; i++) {
		System.out.println("Inserisci voto "+ (i+1) +":");
		stdA.voti[i] = tastiera.nextInt();
		
	}
	
	System.out.println("Media voti di " + stdA.nome +
			   ": " + stdA.mediaVoti());
	
	// definisco un nuovo studente:

	Studente stdB = new Studente();
	
	System.out.println("Inserisci nome B");
	
	stdB.nome = tastiera.nextLine();
	
	for (int i=0; i<3; i++) {
		System.out.println("Inserisci voto "+ (i+1) +":");
		stdB.voti[i] = tastiera.nextInt();
		
	}
	

    System.out.println("Media voti di " + stdB.nome +
			   ": " + stdB.mediaVoti());
    }

}

7 Risposte

  • Re: Syntax error on token ";", , expected

    Scrivi

    int[] voti = new int[3];
  • Re: Syntax error on token ";", , expected

    Grande … funziona!

    ma questa soluzione nella documentazione convenzionale mi sembra di non averla trovata…?

  • Re: Syntax error on token ";", , expected

    Un ultima cosa…

    perché questo lo salta:

    stdB.nome = tastiera.nextLine();

    e passa direttamente all'inserimento del primo voto dello studente B senza farmi inserire prima il nome? 

  • Re: Syntax error on token ";", , expected

    Come ti ha detto giustamente oregon, quello è il modo corretto per dichiarare ed inizializzare un array di 3 interi.

    In quel punto, infatti, sei nella parte dichiarativa della classe (ovvero al di fuori di un metodo). Al di fuori di un metodo puoi solo effettuare dichiarazioni (ed eventualmente inizializzazioni contestuali), ma non puoi scrivere istruzioni “operative”. L'inizializzazione è un'istruzione operativa, quindi può essere effettuata solo all'interno di un metodo.

    Devi tenere a mente la differenza che c'è tra la dichiarazione di una variabile e la sua inizializzazione: la dichiarazione di una variabile serve a specificarne nome e tipo. L'inizializzazione serve a dare alla variabile un valore. Sono due operazioni distinte. Nella parte dichiarativa di una classe è ammessa solo la dichiarazione delle variabili.

    Il linguaggio Java (come altri) consente di effettuare una cosa combinata: dichiarazione + inizializzazione nella stessa istruzione. Questa forma è ammessa nella parte dichiarativa di una classe, ma, appunto, deve essere fatta nella stessa istruzione.

  • Re: Syntax error on token ";", , expected

    Perfetto  grazie ancora ottima spiegazione…

    mi potresti suggerire un link dove Java sia spiegato proprio come hai fatto tu adesso?

    mi puoi aiutare a capire questo:

    perché questo lo salta

    stdB.nome = tastiera.nextLine();

    e passa direttamente all'inserimento del primo voto dello studente B senza farmi inserire prima il nome? 

  • Re: Syntax error on token ";", , expected

    Il problema è dovuto all'uso di nextInt() nei cicli in cui leggi i valori dei voti.

    Scanner funziona a “token”. Lui prende la stringa e la tokenizza in base a dei delimitatori, poi in base al metodo richiamato (nextInt(), nextDouble(), ecc) ritorna il primo token che matcha la richiesta consumando tutto l'input che c'era prima, ma lasciando nel buffer tutto ciò che viene dopo.

    Quando tu scrivi dell'input da tastiera, termini l'inserimento premendo INVIO. L'INVIO corrisponde al carattere “\n” (su Windows, alla coppia di caratteri “\r\n”). Quindi, quando tu digiti, ad esempio, il nome dello studente (supponiamo “Mario”), nel buffer arriva questa sequenza:

    M a r i o \n

    Come vedi c'è quel “\n” alla fine. Il metodo readLine() consuma tutto l'input fino ad un delimitatore di riga ("\n" e “\r” sono dei delimitatori di riga). Quindi dopo aver restituito il nome dello studente, Scanner rimuove dal buffer tutto quello che c'era prima del delimitatore di riga e anche il delimitatore stesso per prepararsi a leggere il resto.

    Quando tu usi nextInt() accade qualcosa di “diverso”: nextInt() recupera il primo token intero delimitato da un whitespace, ma lascia il delimitatore finale nel buffer. Quindi, quando tu dai in pasto al tuo programma il voto (ad esempio 8), nel buffer arriva:

    8 \n

    nextInt() prende il valore 8, lo restituisce come intero e lasca nel buffer il “\n”.

    Poi vai ad indicare il secondo voto, ad esempio, 6 e nel buffer Scanner si ritrova con questo:

    \n 6 \n

    Lui restituisce il 6, consuma (cioè elimina) tutto ciò che c'era prima e lascia, di nuovo, il “\n”.

    Avanti così, fino al prossimo studente: qui chiedi il nome e usi nextLine(). Nel buffer, c'è il “\n” dell'ultimo voto inserito. Per nextLine() tanto basta. Restituisce una bella stringa vuota, consuma il “\n” e si va oltre.

    Come si risolve? Semplice: dopo ciascuna lettura dei voti, ovvero dopo ogni nextInt(), metti un nextLine() “a vuoto” in modo da consumare il “\n” residuo:

    	for (int i=0; i<3; i++) {
    		System.out.println("Inserisci voto "+ (i+1) +":");
    		stdA.voti[i] = tastiera.nextInt();
    		tastiera.nextLine();   // un nextLine() a vuoto per consumare il "\n"
    	}

    Prova.

  • Re: Syntax error on token ";", , expected

    Complimenti ancora per la chiarezza…

    funziona!

Devi accedere o registrarti per scrivere nel forum
7 risposte