Oppure

Loading
14/08/09 23:11
BlackTazz
Salve a tutti, vi volevo chiedere un aiuto xke ho un problemino con l'esercizio del mio libro. Vi riporto il testo:
_________________________________________________________
Il metodo System.out.printf dispone di formati predefiniti per visualizzare numeri interi, numeri in virgola mobile e altri tipi di dati, ma può anche essere esteso: usando il formato S, potete visualizzare qualunque classe che realizzi l'interfaccia Formattable, dotata di un unico metodo:

void formatTo(Formatter formatter, int flags, int width, int precision)

In questo esercizio dovete modificare la classe BankAccount in modo che realizzi l'interfaccia Formattable. Ignorate i parametri flags e precision, visualizzando semplicemente il saldo del conto usando la larghezza specificata da width. Per assolvere a questo compito avete bisogno di un riferimento di tipo Appendable, come questo:

Appendable a = formatter.out();

Appendable è un'altra interfaccia, dotata dell'unico metodo

void append(CharSequence sequence)

CharSequence è, a sua volta, un'altra interfaccia, realizzata da molte classi, tra cui la classe String. Per prima cosa costruite una stringa convertendo in una stringa il saldo del conto, per poi aggiungere spazi fino al raggungimento della larghezza desiderata.
Infine, passate tale stringa al metodo append.
_________________________________________________________

Ecco il testo era questo qua sopra...ogni tanto il libro spara fuori esercizi che uno studente normale non può realizzare a quel punto del libro xke non ha le basi, mi è capitato già un paio di capitoli fa dove mi chiedeva di fare applicazioni che reagissero ad eventi del mouse, quando non sapevo ancora che esistessero le interfaccie O.o
Xro credo di essere arrivato vicino alla soluzione dell'esercizio e volevo chiedervi dove sbagliavo. ;)
Questo è il codice che ho scritto:

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
package Cap1to8;
import java.util.Formattable;
import java.util.Formatter;

public class BankAccount implements Formattable
{

private double saldo;
private int numero_conto;
private String nome_intestatario;

public BankAccount()
{
saldo = 0;
numero_conto = 0;
nome_intestatario = "Nessun nome inserito";
}

public BankAccount(double ammontare, int numero, String nome)
{
saldo = ammontare;
numero_conto = numero;
nome_intestatario = nome;
}

public void deposita(double ammontare)
{
saldo = saldo + ammontare;
}

public void preleva(double ammontare)
{
saldo = saldo - ammontare;
}

public void applicaInteressi(double interessi)
{
saldo = (saldo*(interessi/100)) + saldo;
}

public double estrattoconto()
{
return saldo;
}

public void cambiaNome(String nome)
{
nome_intestatario = nome;
}

public String getName()
{
return nome_intestatario;
}

public int getAccountNumber()
{
return numero_conto;
}

public void formatTo(Formatter formatter, int flags, int width, int precision)
{
Appendable a = formatter.out();
//medoto molto rudimentale x convertirlo in una stringa, ma tanto funziona :p
String conto = ""+saldo;
if(conto.length()<width)
{
int differenza = width-conto.length();
for(int i=0; i<differenza; i++)
{
conto=conto+" ";
}
}
else
{
conto = conto.substring(0, width);
}

a.append(conto);
}
}

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Mi sembra tutto giusto ma dove c'è scritto a.append(conto) mi segna un errore.
Ora le possibilità sono varie, intanto il testo nn mi diceva con che oggetto dovevo usare tale metodo, ma visto che mi ha fatto creare un oggetto di tipo Appendable prima Appendable a = formatter.out(); e il metodo append è dell'interfaccia appena citata mi è parso ovvio applicarlo ad "a"...ho fatto male?
Il messaggio di errore dice che nn ho dichiarato un eccezzione di I/O, il testo dice:
"unreported exception java.io.IOExteption; must be caught or declared to be thrown".
Ma c'è un problema, nel libro non sono mai state trattate le eccezzioni fino ad adesso e io non le so di certo usare visto che è la prima volta che programmo, quindi è impossibile che mi chieda in questo esercizio di mandarne una O.o
Allora ho sbagliato modo di realizzare il metodo? Non capisco...ditemi come avreste svolto voi l'esercizio vi prego, che stò andando in paranoia ^^
Ah aggiungo che se creo un oggetto di tipo StringBuilder e poi con l'oggetto uso il metodo append, il programma poi funziona alla perfezione, ma il problema è che non ho mai visto in vita mia un oggetto StringBuilder, ho fatto così xke ho trovato su internet gente che lo aveva nel codice quando realizzava l'interfaccia Formattable, e poi il libro non ne parla quindi non credo che sia quella la soluzione.
E poi cosa strana, ho notato questo guardando nei sorgenti della classe Formatter:

public Formatter(Appendable a) {
    if (a == null)
     a = new StringBuilder();
    init(a, Locale.getDefault());
}

public Appendable out() {
    ensureOpen();
    return a;
}

Ora io non so con che costruttore viene creato il formatter del metodo dell'interfaccia Formattable, ma se viene creato come qui sopra allora la mia variabile "a" dovrebbe essere proprio un oggetto StringBuilder dopo questa linea di codice Appendable a = formatter.out(), e il programma dovrebbe funzionare a maggior ragione!!!
Boooh non so + che pensare :( Come ho detto prima provate a farlo voi che siete esperti e ditemi dov'è la nabbata che ho fatto :p

Ps.La classe BankAccount, tranne l'implementazione dell'interfaccia Formattable e la realizzazione del suo metodo deve essere lasciata così xro, potete cambiare tt il resto ^^

Grazie a tutti in anticipo,
Ciau

Franz
Ultima modifica effettuata da BlackTazz 14/08/09 23:16
aaa
15/08/09 20:15
HEAD
..non ho testato la tua classe ma l'errore generato sulla linea( a.appender )e dovuto ad una mancanza di gestione delle eccezioni , in effetti il metodo appender deve essere gestito e dichiarato in un try{}catch(IOException ex){} in questo modo non darà errore salvo il codice sia corretto.. potresti provare cosi:


try {
Appendable a = formatter.out();
//medoto molto rudimentale x convertirlo in una stringa, ma tanto funziona :p
String conto = "" + saldo;
if (conto.length() < width) {
int differenza = width - conto.length();
for (int i = 0; i < differenza; i++) {
conto = conto + " ";
}
} else {
conto = conto.substring(0, width);
}

a.append(conto);

} catch (IOException ex) {
Logger.getLogger(BankAccount.class.getName()).log(Level.SEVERE, null, ex);
}
}

ciao....
aaa
15/08/09 21:41
BlackTazz
Grazie x avermi risposto ;)
Cmq la mia perplessità è proprio questa...lo sapevo anche io che dovevo lanciare un eccezzione (me lo diceva il compilatore), ma possibile mai che il libro mi dia un esercizio che non posso ancora fare?! Le eccezzioni non sono ancora state trattate nello svolgimento...:-|
E mi chiedevo se avevo sbagliato in qualche modo la mia classe, e doveva essere fatta in modo che uno al mio livello potesse farla funzionare...
Cmq sia se non c'è modo di utilizzare il metodo append() senza dichiarare un eccezzione allora significa proprio che il libro ha sbagliato...xke mi ha detto proprio lui nel testo dell'eserizio(l'ho scritto nel post precedente) di usare il metodo append()!
Se mi confermate che non potevo svolgere l'esercizio senza conoscere le eccezzioni mi metto l'anima in pace, grazie :D
aaa
16/08/09 10:15
HEAD
se devi utilizzare per forza appender di Appendable.. allora devi gestire le eccezioni
ma se hai scelta di gestire come meglio ritieni la tua classe, sempre Utilizzando Appendable
puoi utilizzare append di StringBuilder, in questo modo non dovrai gestire le eccezioni ed hai lo stesso risultato..
Esempio:

Appendable a = formatter.out();

StringBuilder b=new StringBuilder();

b.append(a);

ciao...


aaa
16/08/09 10:32
BlackTazz
Da questo testo:

Il metodo System.out.printf dispone di formati predefiniti per visualizzare numeri interi, numeri in virgola mobile e altri tipi di dati, ma può anche essere esteso: usando il formato S, potete visualizzare qualunque classe che realizzi l'interfaccia Formattable, dotata di un unico metodo:

void formatTo(Formatter formatter, int flags, int width, int precision)

In questo esercizio dovete modificare la classe BankAccount in modo che realizzi l'interfaccia Formattable. Ignorate i parametri flags e precision, visualizzando semplicemente il saldo del conto usando la larghezza specificata da width. Per assolvere a questo compito avete bisogno di un riferimento di tipo Appendable, come questo:

Appendable a = formatter.out();

Appendable è un'altra interfaccia, dotata dell'unico metodo

void append(CharSequence sequence)

CharSequence è, a sua volta, un'altra interfaccia, realizzata da molte classi, tra cui la classe String. Per prima cosa costruite una stringa convertendo in una stringa il saldo del conto, per poi aggiungere spazi fino al raggungimento della larghezza desiderata.
Infine, passate tale stringa al metodo append.

Non mi parla di StringBuilder, quindi mi sa che devo proprio usare append di Appendable...

Cmq i programma funziona perfettamente grazie al tuo aiuto di ieri :k:
Bastava mettere quel try{} e catch {} ... anche se x ora non li so usare xke non sono ancora arrivato a quel punto del libro :pat:

EDIT: Ho provato a fare con StringBuilder adesso togliendo le eccezzioni, mi compila senza errori ma non mi stampa + nulla quando invoco printf :om:
Sei sicuro che gli devo passare nel metodo proprio la variabile "a"? che è un Appendable?
Non dovrei passargli una stringa?
Ho provato a passargli una stringa, mi compila senza errori ma continua a non stamparmi nulla :(
Ultima modifica effettuata da BlackTazz 16/08/09 10:46
aaa
16/08/09 11:15
HEAD
Postato originariamente da BlackTazz:

Da questo testo:

Il metodo System.out.printf dispone di formati predefiniti per visualizzare numeri interi, numeri in virgola mobile e altri tipi di dati, ma può anche essere esteso: usando il formato S, potete visualizzare qualunque classe che realizzi l'interfaccia Formattable, dotata di un unico metodo:

void formatTo(Formatter formatter, int flags, int width, int precision)

In questo esercizio dovete modificare la classe BankAccount in modo che realizzi l'interfaccia Formattable. Ignorate i parametri flags e precision, visualizzando semplicemente il saldo del conto usando la larghezza specificata da width. Per assolvere a questo compito avete bisogno di un riferimento di tipo Appendable, come questo:

Appendable a = formatter.out();

Appendable è un'altra interfaccia, dotata dell'unico metodo

void append(CharSequence sequence)

CharSequence è, a sua volta, un'altra interfaccia, realizzata da molte classi, tra cui la classe String. Per prima cosa costruite una stringa convertendo in una stringa il saldo del conto, per poi aggiungere spazi fino al raggungimento della larghezza desiderata.
Infine, passate tale stringa al metodo append.

Non mi parla di StringBuilder, quindi mi sa che devo proprio usare append di Appendable...

Cmq i programma funziona perfettamente grazie al tuo aiuto di ieri :k:
Bastava mettere quel try{} e catch {} ... anche se x ora non li so usare xke non sono ancora arrivato a quel punto del libro :pat:

EDIT: Ho provato a fare con StringBuilder adesso togliendo le eccezzioni, mi compila senza errori ma non mi stampa + nulla quando invoco printf :om:
Sei sicuro che gli devo passare nel metodo proprio la variabile "a"? che è un Appendable?
Non dovrei passargli una stringa?
Ho provato a passargli una stringa, mi compila senza errori ma continua a non stamparmi nulla :(

---------------------------------------------------------------------------------------
si hai ragione e stato un lapsus :rofl:

non stampa perchè in effetti come ti dicevo sopra appender di StringBuilder prende Appendable senza valore , per visualizzare il contenuto Appendable deve appender il conto
quindi lo devi gestire per forza in un try{}catch(){} ....
ha me funzionava perche mi ero fatto altri metodi per stampare il conto , e non mi sono accorto che nella stampa richiamavo il mio metodo, e non il StringBuilder ... be l'importante che funziona ...
:k: ciao..
aaa
16/08/09 11:26
BlackTazz
Ah ahhhnnnn!
Quindi era come pensavo...come al solito mi sono beccato un esercizio che mi chiede di gestire eccezzioni senza spiegarle xD
Vabbè dai problema risolto grazie mille ^^
Tra poco apro un nuovo topic, xke risolto un prob ne ho trovato un altro :rotfl:
(Altro esercizio ovviamente, BASTA questo :D )
aaa