Esercizio Java

di il
8 risposte

Esercizio Java

Ciao a tutti,
Vi scrivo per chiedervi per un problema banale ma che non riesco a risolvere, premetto che è la mia prima volta con java e sono alle prime armi (non ho molta esperienza nella programmazione) Sto facendo un esercizio in cui bisogna creare un'applicazione dove dovrei salvare i dati utente dei clienti che si registrano e implementare funzionalità come la ricerca di determinati eventi per nome, tipo, data ecc. La prima cosa che ho fatto è stata creare la classe User:
import java.util.Scanner;
import java.util.UUID;
public class User {
	
	public String id;
	private String nickname;
	private String password;
	private String mail;
	private int numcell;
	
	public User (String nickname, String password, String mail, int numcell) {
		this.id = UUID.randomUUID().toString();
		this.nickname = nickname;
		this.password = password;
		this.mail = mail;
		this.numcell = numcell;
		
	}
	
	public String get_id() {
		return this.id;
	}
	
	public String get_nickname() {
		return this.nickname;
	}
	
	public String get_password () {
		return this.password;
	}
	
	public String get_mail () {
		return this.mail;
	}
	
	public int get_numcell () {
		return this.numcell;
	}
	
	public void set_nickname (String nickname) {
		this.nickname = nickname;
	}
	
	public void set_password (String password) {
		this.password = password;
	}
	
	public void set_mail (String mail) {
		this.mail = mail;
	}
	
	public void set_numcell (int numcell) {
		this.numcell = numcell;
	}
	
}  
Poi ho deciso di creare un metodo (sempre della classe User) in cui chiedo ai futuri clienti nickname, password ecc. :
	public String showinfo() {
		
		Scanner scanner = new Scanner(System.in);
		System.out.print("WELCOME! ENTER YOUR USERNAME: "\n);
		String nn = scanner.nextLine();
		System.out.print("ENTER YOUR PASSWORD: "\n);
		String psw = scanner.nextLine();
		System.out.println("ENTER YOUR E-MAIL: "\n);
		String email = scanner.nextLine();
		System.out.println("ENTER YOUR MOBILE NUMBER: "\n);
		int numcell = scanner.nextInt();
		
		User u1 = new User(nn, psw, email, numcell) ;
	
}
Mi dà errore e non capisco il motivo: mi chiede di cambiare System.out.print in Systemm.out.prinln, ma quando lo cambio mi richiede di cambiarlo da .println a .print

Ho chiamato questa funzione dal main della classe che ho chiamato UserApp e mi dà questo errore:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method showinfo() is undefined for the type UserApp.

Ringrazio in anticipo chi mi risponderà.

8 Risposte

  • Re: Esercizio Java

    DadaLilli ha scritto:


    Mi dà errore e non capisco il motivo: mi chiede di cambiare System.out.print in Systemm.out.prinln, ma quando lo cambio mi richiede di cambiarlo da .println a .print

    Ho chiamato questa funzione dal main della classe che ho chiamato UserApp e mi dà questo errore:
    Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    The method showinfo() is undefined for the type UserApp.
    Partiamo dalla classe User. Nella programmazione Java generalmente NON si usa il "_" nei nomi (né di variabili né di metodi). Ci sono invece delle convenzioni dettate dalle specifiche JavaBeans per i metodi "getter" e "setter". Ovvero si mette es. getId, getNickname (o getNickName), ecc... setId, setNickname, setPassword, ecc...
    Il campo id potrebbe stare come private ma non è quello un problema rilevante.

    Quello che invece non va proprio bene è il showinfo(). La classe User dovrebbe solo "modellare" logicamente un utente e basta, NON dovrebbe chiedere o mostrare qualcosa ad un utente. Quindi showinfo() lì non va molto bene e andrebbe messo altrove (altra classe).

    Il showinfo() comunque è sbagliato per diversi motivi. Innanzitutto nelle applicazioni "console" si dovrebbe creare solo UN oggetto Scanner connesso a System.in. Mentre invece verrebbe ricreato ad ogni invocazione di showinfo().
    I print comunque sono sbagliati, hai messo \n "fuori" dalle stringhe e comunque \n NON è il newline in generale. Quindi se vuoi andare a capo devi usare println invece di print.

    Inoltre il metodo dichiara ritorno String ma dal metodo non restituisci nulla (perché dovrebbe ritornare String ??).
    E infine c'è una questione su Scanner che frega molti: il mix di nextLine e nextInt (nextXyz in generale). Leggi qui https://www.iprogrammatori.it/forum-programmazione/java/sono-neofita-non-capisco-cosa-non-t40828.html
    Quindi questo metodo va riscritto bene e altrove, cioè non in User.

    E dovresti mostrare la UserApp, perché magari ci sono errori anche lì.
  • Re: Esercizio Java

    Ciao, innanzitutto ti ringrazio moltissimo per la risposta e la pazienza. Non ho ben capito alcune cose:
    E' vero che in showinfo() avrei dovuto usare void, ho pensato di usarlo nella classe UserApp (che non ho ancora fatto), ma non ho capito la cosa dell'unico oggetto Scanner, io ne ho creato più di uno? E in che senso deve essere ricreato ad ogni invocazione di showinfo()?
    Ho letto il link, dove parli dell'invio che rimane bufferizzato nello scanner quando ci sono sia nextLine che nextInt, come posso risolvere la cosa?
  • Re: Esercizio Java

    DadaLilli ha scritto:


    io ne ho creato più di uno?
    Se invochi più volte showinfo() (anche su oggetti User differenti) ... sì, ne crei di più.

    Ne serve e basta uno solo in tutta l'applicazione di oggetto Scanner connesso a System.in.

    DadaLilli ha scritto:


    Ho letto il link, dove parli dell'invio che rimane bufferizzato nello scanner quando ci sono sia nextLine che nextInt, come posso risolvere la cosa?
    O non usi nextInt, usi solo nextLine e fai il parsing con Integer.parseInt() per avere un int dove serve
    ... o metti un nextLine() "a vuoto" (senza usare il valore) giusto per buttare via il newline. Ma quest'ultimo è più critico, l'utente NON è obbligato a dare invio dopo un nextInt. Se inserisce 123 spazio ciao invio e dopo il nextInt fai un nextLine ... butti via anche il ciao che magari serviva.
    Generalmente meglio il primo.
  • Re: Esercizio Java

    Ciao,
    Allora ho tolto showinfo() dalla classe User e l'ho inserita nella classe UserApp, i codici:

    CLASSE USER:
    package progettoSweng;
    import java.util.UUID;
    
    public class User {
    	
    	private String id;
    	private String nickname;
    	private String password;
    	private String mail;
    	private int numcell;
    	
    	public User (String nickname, String password, String mail, int numcell) {
    		this.id = UUID.randomUUID().toString();
    		this.nickname = nickname;
    		this.password = password;
    		this.mail = mail;
    		this.numcell = numcell;
    		
    	}
    	
    	public String getId() {
    		return this.id;
    	}
    	
    	public String getNickname() {
    		return this.nickname;
    	}
    	
    	public String getPassword () {
    		return this.password;
    	}
    	
    	public String getMail () {
    		return this.mail;
    	}
    	
    	public int getNumcell () {
    		return this.numcell;
    	}
    	
    	public void setId(String id) {
    		this.id = id;
    	}
    	
    	public void setNickname (String nickname) {
    		this.nickname = nickname;
    	}
    	
    	public void setPassword (String password) {
    		this.password = password;
    	}
    	
    	public void setMail (String mail) {
    		this.mail = mail;
    	}
    	
    	public void setNumcell (int numcell) {
    		this.numcell = numcell;
    	}
    	
    }
    CLASSE USERAPP:
    package progettoSweng;
    import java.util.Scanner;
    import progettoSweng.User;
    
    
    public class UserApp {
    
    	public static void main(String[] args) {
    			selectinfo ();
    	}
    	
    	public static void selectinfo() {
    		
    		Scanner scanner = new Scanner(System.in);
    		System.out.println("WELCOME TO THE REGISTRATION! ENTER YOUR USERNAME:\n");
    		String un = scanner.nextLine();
    		System.out.println("ENTER YOUR PASSWORD:\n");
    		String psw = scanner.nextLine();
    		System.out.println("ENTER YOUR E-MAIL:\n");
    		String mail = scanner.nextLine();
    		System.out.println("ENTER YOUR MOBILE NUMBER:\n");
    		int numcell = Integer.parseInt(scanner.nextLine()); 
    		scanner.close();
    		
    		User u1 = new User (un, psw, mail, numcell);
    		
    		System.out.print("REGISTRATION COMPLETED! YOUR ID:  " + u1.id + "\n" + "YOUR USERNAME: " + u1.get_nickname()+"\n" + "YOUR PASSWORD: " + u1.get_password()+"\n" + "\n" + "YOUR E-MAIL: "+u1.get_mail());
    		
    		}
    }
    
    1) Non sono molto sicura di aver risolto la cosa dello scanner che viene creato più di una volta (credo proprio di no)
    2) quando compila e inserisco i dati va tutto bene fino a quando inserisco numcell che mi dà questo errore:
    Exception in thread "main" java.lang.NumberFormatException: For input string: "ff"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
    at java.base/java.lang.Integer.parseInt(Integer.java:658)
    at java.base/java.lang.Integer.parseInt(Integer.java:776)
    at progettoSweng/progettoSweng.UserApp.selectinfo(UserApp.java:22)
    at progettoSweng/progettoSweng.UserApp.main(UserApp.java:9)
  • Re: Esercizio Java

    DadaLilli ha scritto:


    1) Non sono molto sicura di aver risolto la cosa dello scanner che viene creato più di una volta (credo proprio di no)
    Lo Scanner lo crei ora una volta sola, ok.

    DadaLilli ha scritto:


    2) quando compila e inserisco i dati va tutto bene fino a quando inserisco numcell che mi dà questo errore:
    Exception in thread "main" java.lang.NumberFormatException: For input string: "ff"
    Beh, la riga del parseInt è corretta. La domanda allora sarebbe: che cosa hai inserito esattamente? Dove hai scritto "ff" ? (se ti dice input string: "ff" vuol dire che è stato inserito un ff da qualche parte ....)
  • Re: Esercizio Java

    L'ho inserito quando viene chiesto il numcell, in realtà avevo provato anche inserendo un numero e mi dava comunque un errore simile:
    Exception in thread "main" java.lang.NumberFormatException: For input string: "4560123843"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
    at java.base/java.lang.Integer.parseInt(Integer.java:658)
    at java.base/java.lang.Integer.parseInt(Integer.java:776)
    at progettoSweng/progettoSweng.UserApp.selectinfo(UserApp.java:22)
    at progettoSweng/progettoSweng.UserApp.main(UserApp.java:9)
    Ho provato ad inserire un numero a 4 cifre e non mi ha dato errore, ho provato a modificare int in long int nella classe User ma mi dà lo stesso errore
  • Re: Esercizio Java

    DadaLilli ha scritto:


    Exception in thread "main" java.lang.NumberFormatException: For input string: "4560123843"
    Un int va da
     -2147483648 a 2147483647
    
    tu hai scritto 4560123843
    e come vedi è "oltre" un int.

    DadaLilli ha scritto:


    ho provato a modificare int in long int nella classe User
    E questo è giusto.

    MA
    Devi chiaramente poi usare Long.parseLong
  • Re: Esercizio Java

    Grazie mille!!
Devi accedere o registrarti per scrivere nel forum
8 risposte