View Full Version : [java]aiuto controlli input
misterxxitalia
24-01-2008, 14:07
ciao a tutti sto cercando di creare dei controlli che mi permettano di intercettare dei dati fasulli (tipo dati nulli o dati troppo corti).queste sono le propieta di nominativo...
class Rubrica
{
private String nome;
private String cognome;
private String indirizzo;
private String telefono;
private String affinita;
Rubrica(String Nome, String Cognome, String Indirizzo, String Telefono, String Affinita) {
try
{
setNome(Nome);
setCognome(Cognome);
setIndirizzo(Indirizzo);
setTelefono(Telefono);
setAffinita(Affinita);
}
catch (IOException e) {
System.out.println(e);
}
catch (InserimentoErratoException e)
{
System.err.println(e);
}}
e questo è il mio metodo per intercettare gli errori...
public void setNome(String Nome)throws InserimentoErratoException, IOException {
if(Nome.length()<4|| Nome.equals("")){
throw new InserimentoErratoException();
}
else {
this.nome = Nome;
}
}
public String getNome() {
return nome;
}
è solo che mi da errore sul metodo getNome() chi mi sa dire cosa sbaglio??grazie!!
banryu79
24-01-2008, 14:12
Che errore ti da? Se ci posti tutto il codice è più facile capire.
Considera anche che se fai un getNome() subito dopo un setNome() che "fallisce", nome sarà null e verrà sollevata una NullPointerException.
Questo perchè hai dichiarato "nome" senza inizializzarlo.
private String nome;
Se ti va bene avere nome come una stringa vuota puoi fare così:
private String nome = new String();
Se, invece, come vedo nell'if in setNome() è proprio un caso che vuoi evitare allora
potresti inizializzarlo a un valore "senza senso", tipo:
private String nome = "not defined";
misterxxitalia
24-01-2008, 14:30
guarda mi da illegal start of expression sul metodo getnome()sinceramente non capisco cosa sbaglio...io vorrei proprio evitare che mi vengano dati in input certi dati...
banryu79
24-01-2008, 14:38
guarda mi da illegal start of expression sul metodo getnome()sinceramente non capisco cosa sbaglio...io vorrei proprio evitare che mi vengano dati in input certi dati...
Ah, allora è un errore di compilazione, io pensavo partisse qualche eccezione a runtime...
Come ho detto sopra, posta tutto il codice della classe (magari ordinatamente identato :) ), ci si mette un attimo a trovare l'errore, che comunque dovrebbe essere un errore di sintassi a questo punto.
Arguisco che non utilizzi un'IDE che ti segnala dinamicamente gli errori di sintassi, con che programma editi il codice?
misterxxitalia
24-01-2008, 14:42
scusa posso passarti la mia classe in privato?ci sono persone che copiano la classe completamente e la spacciano x propria...
banryu79
24-01-2008, 15:00
scusa posso passarti la mia classe in privato?ci sono persone che copiano la classe completamente e la spacciano x propria...
Spiacente misterxxitalia, ma preferisco di no.
L'aiuto che sono disposto a dare lo do in pubblico, per scelta non accetto di aiutare in privato in contesti di forum pubblici.
Comunque non dovresti fare fatica a trovare l'errore: è un errore di sintassi, ma non lo rilevo nel codice che hai postato tu nel primo post.
Cmq, visto che l'illegal start of expression te la da sul metodo getNome(), vai a vedere cosa hai scritto nel codice della classe sulle righe subito prima della definizione di getNome(): il problema è là (magari hai chiuso male il metodo precedente, manca una parentesi graffa di chiusura o roba del genere)
misterxxitalia
24-01-2008, 15:11
ecco infatti il problema è che avevo chiuso male!!mi perdo sempre sulle stupidagini!!:muro:
ora quando vado a usare quel metodo scrivo cosi':
BufferedReader tastiera = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi il nome:");
System.out.println("==>");
String Nome = tastiera.readLine();
Rubrica.setNome(Nome);
su Rubrica.setNome(Nome) mi da come errore cannot be referenced from a static contest..questo che vuol dire??
banryu79
24-01-2008, 15:52
Scusa ma come fai a chiamare il metodo setNome() in quel modo?
quando fai Rubrica.setNome() stai tentando di invocare setNome() dal nome della classe, ma perchè ciò sia possibile setNome() deve essere dichiarato static, cosa che da te vedo non è.
Altrimenti devi usare un'istanza della classe, non la classe stessa, per invocare il metodo:
Rubrica miaRubrica = new Rubrica( parametri al costruttore, bal, bla, bla);
...
miaRubrica.setNome("Arturo Bracchetti");
Piccola "nota di stile"....
BufferedReader tastiera = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi il nome:");
System.out.println("==>");
String Nome = tastiera.readLine();
Rubrica.setNome(Nome);
Per convenzione (e quindi questione di leggibilità di tutti) i nomi di variabili iniziano con la lettera minuscola, così come i nomi dei metodi; solo i nomi di Classi iniziano con la maiuscola.
così:
BufferedReader tastiera = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi il nome:");
System.out.println("==>");
String nome = tastiera.readLine();
Rubrica.setNome( nome);
poi fai come preferisci (De gustibus), non è una critica, solo un consiglio.
misterxxitalia
24-01-2008, 16:14
tutti i consigli e critiche sono ben accette!!scusa non capisco bene come intendi usare lo static...ora ti posto il metodo:
void aggiunginomintativo() {
Rubrica miaRubrica = new Rubrica (setNome(mionome),setCognome(miocognome),setIndirizzo(mioindirizzo),setTelefono(miotelefono),setAffinita(miaaffinita));
boolean cicla = false;
do {
cicla = false;
try
{
BufferedReader tastiera = new BufferedReader(new InputStreamReader(System.in));
System.out.println("dammi il nome:");
System.out.println("==>");
String mionome = tastiera.readLine();
miaRubrica.setNome(mionome);
System.out.println("dammi il cognome");
System.out.println("==>");
String cognome = tastiera.readLine();
Rubrica.setNome(miocognome);
System.out.println("dammi il recapito");
System.out.println("==>");
String recapito = tastiera.readLine();
Rubrica.setNome(miorecapito);
System.out.println("dammi il numero di telefono");
System.out.println("==>");
String telefono = tastiera.readLine();
Rubrica.setNome(miotelefono);
System.out.println("dammi il tipo di affinita; premi a per 'conoscente';b per 'amico';c per 'parente' d per 'amicone' e per 'amicissimo'");
System.out.println("==>");
miaaffinita = leggiStringa();
String affinitascelta ="";
switch (miaaffinita.charAt(0)) {
case 'a':affinitascelta = "conoscente";
break;
case 'b':affinitascelta = "amico";
break;
case 'c':affinitascelta = "parente";
break;
case 'd':affinitascelta = "amicone";
break;
case 'e':affinitascelta = "amicissimo";
break;
default: cicla = true;
}
if (!(nominativi.contains(x)))nominativi.add(x);
else System.out.println ("nominativo gia esistente!");
cicla = true;
}
catch (IOException e) {
System.out.println(e);
cicla = true;
}
catch (StringIndexOutOfBoundsException e){
System.out.println(e);
cicla = true;
}
catch (InserimentoErratoException e)
{
System.err.println(e);
cicla = true;
}
}
while ( cicla );
}
}
oltre a non poter essere void il metodo che sbaglio??
Gargiulo
24-01-2008, 16:29
non sono stato a leggere il codice, ma il punto è che il metodo devi chiamarlo sulla variabile miaRubrica, non sulla classe Rubrica. Per poter invocare un metodo su una classe, il metodo deve essere "statico".
Gargiulo
24-01-2008, 16:32
il problema sta in queste righe:
Rubrica.setNome(miocognome);
Rubrica.setNome(miorecapito);
che sono sbagliate, devono diventare
miaRubrica.setCognome(miocognome);
miaRubrica.setRecapito(miorecapito);
occhio ai copia-incolla, e mi raccomando se un metodo non è statico non lo puoi invocare sulla classe, va invocato sull'istanza di variabile
misterxxitalia
24-01-2008, 17:18
no no il problema non è quello (con la fretta non ho riscritto tutto correttamente...)
void aggiunginomintativo() {
Rubrica miaRubrica = new Rubrica (setNome(mionome),setCognome(miocognome),setIndirizzo(mioindirizzo),setTelefono(miotelefono),setAffinita(miaaffinita));
mi dice di non trovare la variabile mionome miocognome ecc...(che dichiarerò dopo....) ma come faccio??
Don[ITA]
24-01-2008, 17:40
beh ma è ovvio che non puoi passargli al costruttore di Rubrica variabili che non hai istanziato :)
Io direi di fare cosi:
public class Rubrica{
public Rubrica(){//se vuoi inizializzi le variabili a null o "" o quello che ti pare
}
...metodi della rubrica...
così quando istanzi la classe fai qualcosa come:
Rubrica miaRubrica = new Rubrica();
e poi fai tutti i set che vuoi :D
Ciauz
misterxxitalia
24-01-2008, 18:07
va bene cosi??
class Rubrica
{
private String nome;
private String cognome;
private String indirizzo;
private String telefono;
private String affinita;
public Rubrica(String Nome, String Cognome, String Indirizzo, String Telefono, String Affinita) {
try
{
setNome(Nome);
setCognome(Cognome);
setIndirizzo(Indirizzo);
setTelefono(Telefono);
setAffinita(Affinita);
}
catch (IOException e) {
System.out.println(e);
}
catch (InserimentoErratoException e)
{
System.err.println(e);
}}
adesso come lo chiamo il metodo?
Don[ITA]
24-01-2008, 20:24
Puoi farla così la tua Rubrica:
public class Rubrica {
private String nome;
private String cognome;
private String indirizzo;
private String telefono;
private String affinita;
public Rubrica(){
nome = "";
cognome = "";
indirizzo = "";
telefono = "";
affinita = "";
}
public void setNome(String nome){
this.nome = nome;
}
public String getNome(){
return nome;
}
//e cosi via per tutte le variabili
}
Come hai scritto te nn va bene ;)
Poi i controlli sull'input li fai quando lo richiedi... ;)
Ciauz
misterxxitalia
24-01-2008, 20:33
ho gia messo i controlli quando li chiedevo xo mi è stato fatto notare che si puo baypassare tutti i controlli e scrivere direttamente su setNome()per questo che vorrei mettere li i controlli...tu cosa ne pensi??
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.