Problemi con lo "Scanner" [programmatore alle prime armi]

di Anonimizzato12153 il
12 risposte
Ciao a tutti, mi chiamo Marco e ho 15 anni.
Le premesse da fare prime di esporvi il mio problema sono 3:
- So un programmatore alle prime armi e so molto poco di tutto quello che è la programmazione,
- so qualcosa, veramente poco, anche sulla teoria e i concetti, tuttavia è un argomento che sto approfondendo sempre più,
- studio informatica e sono al primo anno.

Sto cercando di creare un applicazione in Java, come ambiente di lavoro uso Eclipse, questa applicazione, in sostanza, in base a determinati dati che vengono inseriti, da una risposta dicendo a quale categoria appartieni.
Lo sviluppo è ancora agli inizi ma l'errore mi viene dato su una di quello che dovrebbe essere una funzione di base: l'input, ovvero la funzione di scanner.
Vi posto il codice con i relativi errori(**** a lato sx) riscontrati durante il debug.

import java.util.Scanner;

public class CalcolatorePeso {

	public static void main(String[] args) {
****	Scanner in = new Scanner (System.in);
		System.out.println("Come ti chiami?");
		String nome = in.nextLine();
		System.out.println("Sei maschio o femmina?\n (inserisci m o f)");
		String sesso = in.nextLine();
		System.out.println("Qual'è la tua altezza?\n (inserisci valori su base 5, ad es: 160, 175)");
****     	int x = in.nextInt();
		System.out.println("Qual'è il tuo peso?");
		int peso = in.nextInt();
		
		String sesso_deciso;
		if ( sesso == "m") sesso_deciso = "MASCHIO"; else sesso_deciso = "FEMMINA";
		System.out.println( sesso_deciso );
		
		}

}



12 Risposte

  • Ciao!
    Per caso stai parlando dei triangoli gialli? Se così fosse allora si tratta di warning, ovvero "cose che funzionano ma sarebbe meglio non fare" e non di errori veri e propri. In particolare per quanto riguarda le variabili "nome", "x" e "peso" eclipse ti avvisa del fatto che tu le dichiari ma non le usi, e quindi eclipse ti consiglia di eliminarle per risparmiare memoria. Ovviamente se in futuro hai intenzione di utilizzarle puoi ignorare il warning. Per quanto riguarda la variabile "in", ti avvisa del fatto che tu non chiudi mai lo scanner (infatti, quando non ti serve più dovresti fare "in.close()"). Se non lo chiudi allora non liberi le risorse destinate a questo oggetto e, ancora una volta, sprechi memoria e quant'altro.

    Un errore che ho notato è questo: tu fai
    sesso_deciso = "MASCHIO";
    , ma per confrontare due stringhe devi usare il metodo "equals()". In pratica devi fare
    sesso_deciso.equals("MASCHIO");
    Lo stesso ovviamente vale anche per
    sesso_deciso = "FEMMINA";
  • Ciao, innanzitutto grazie della risposta!
    E' tutto chiaro tranne la parte dell'equals, potresti spiegarmi meglio?
    Grazie in anticipo

    P.S. altra cosa, una volta finito il progetto come faccio a creare il .dmg??
  • E' semplice: per i tipi di dati primitivi (ovvero int, double, boolean, e quant'altro) il confronto si fa tramite l'operatore "==". Per gli oggetti, invece, l'operatore "==" confronta gli hash dell'oggetto, quindi restituisce true solamente se le due variabili referenziano lo stesso oggetto. Per confrontare due stringhe, quindi, devi usare il metodo equals. Ricorda che è case sensitive, quindi "MASCHIO" è diverso da "maschio" e "MaScHiO". Se non ti interessano le differenze maiuscole/minuscole puoi usare "equalsIgnoreCase()".
  • Ok, grazie!
    ultima cosa , una volta finito il progetto come faccio a creare il .dmg??
  • Beh con Java di sicuro non lo fai: se mai arrivi ad ottenere un jar eseguibile..magari poi esiste qualche programma esterno che incapsula i jar in dmg, ma non ne ho idea sinceramente!
  • Della ha scritto:


    E' semplice: per i tipi di dati primitivi (ovvero int, double, boolean, e quant'altro) il confronto si fa tramite l'operatore "==". Per gli oggetti, invece, l'operatore "==" confronta gli hash dell'oggetto.
    La accendiamo???

    Sei sicuro???


    peccato, la corsa verso il milione finisce qui!!!!


    L'operatore di confronto '==' per gli oggetti richiama l'equals della classe Object, che fà il confronto fra gli indirizzi dei due oggetti, e non fra gli hash.

    altrimenti
    String a ="casa";
    String b= "casa";
    System.out.println("Result (b==a) : "+ (b==a));
    System.out.println("Result b.equals(a) : "+ b.equals(a));
  • Hai ragione, è così..
  • Della ha scritto:


    Hai ragione, è così..
    ovviamente il mio intervento era ironico
  • zaknafein83 ha scritto:


    L'operatore di confronto '==' per gli oggetti richiama l'equals della classe Object, che fà il confronto fra gli indirizzi dei due oggetti, e non fra gli hash.
    Veramente è il contrario: è il metodo equals() di Object che usa l'operatore '=='. Questo il sorgente del metodo equals() della classe Object:
    
    public boolean equals(Object obj) {
       return (this == obj);
    }
    
    Ciao.
  • Se non ridefinisci l'equals, infatti
    a == b
    e
    a.equals(b)
    coincidono.

    volevo semplicemente dire che fare == tra due oggetti equivale a richiamare il metodo equals di Object, che facendo il confronto sugli indirizzi fisici (che sono dei tipi di base) userà il confronto con '=='.
  • zaknafein83 ha scritto:


    se non ridefinisci l'equals, infatti
    a == b
    e
    a.equals(b)
    coincidono.

    volevo semplicemente dire che fare == tra due oggetti equivale a richiamare il metodo equals di Object, che facendo il confronto sugli indirizzi fisici (che sono dei tipi di base) userà il confronto con '=='.
    Sì, questo è corretto.

    Ciao.
  • Tranquillo, immaginavo in ogni caso avevo sbagliato!
Devi accedere o registrarti per scrivere nel forum
12 risposte