Erro livro Deitel

7 respostas
V

Eu comprei o Llivro Java como programar dos Deitel. no capítulo 3 eles apresentam um exemplo de umpequeno programa de controle de conta bancária com o seguinte código:

[color=green]
// Fig. 3.14: AccountTest.java
// Cria e manipula um objeto Account
import java.util.Scanner;

public class AccountTest

{

// método principal inicia a execução do aplicativo Java

public static void main( String args[] )

{

Account account1 = new Account( 50.00 );	// cria o objeto Account

Account account2 = new Account( -7.53 );	// cria o objeto Account
// exibe saldo inicial de cada objeto
	System.out.printf( "account1 balance: $%.2f\n",
		account1.getBalance() );
	System.out.printf( "account2 balance: $%.2f\n\n",
		account2.getBalance() );
		
	// cria Scanner para obter entrada a partir da janela de comando
	Scanner input = new Scanner( System.in );
	double depositAmount;	// quantia de depósito lida do usuário
	
	System.out.print( "Enter deposit for account1: " );	// prompt
	depositAmount = input.nextDouble();	// obtém a entrada do usuário
	System.out.printf( "\nadding %2.f to account1 balance\n\n",
		depositAmount );
	account1.credit(  depositAmount );	// adiciona o saldo de account1
	
	// exibe os saldos
	System.out.printf( "account1 balance: $%.2f\n",
		account1.getBalance() );
	System.out.printf( "account2 balance: $%.2f\n\n",
		account2.getBalance() );
	
	System.out.print( "Enter deposit amount for account2: " );	// prompt
	depositAmount = input.nextDouble();	// obtém a entrada do usuário
	System.out.printf( "\nadding %.2f to account2 balance\n\n",
		depositAmount );	
	account2.credit( depositAmount );	// adiciona ao saldo de account
		
	// exibe os saldos
	System.out.printf( "account1 balance: $%.2f\n",
		account1.getBalance() );
	System.out.printf( "account2 balance: $%.2f\n",
		account2.getBalance() );
}	// fim de main

} // fim da classe AccountTest


// Fig. 3.13: Account.java
// Classe Account com um construtor para
// inicializar a variável de instância balance

public class Account
{
private double balance; // variável de instância que armazena o saldo

// construtor
public Account( double initialBalance )
{
	// valida que initialBalance é maior que 0.0
	// se não, o saldo é inicializado como o valor padrão 0.0
	if ( initialBalance > 0.0 )
		balance = initialBalance;
}	// fimdo contrutor Account

// credita (adiciona) uma quantia à conta
public void credit( double amount )
{
	balance = balance + amount;	// adiciona quantia ao saldo
}	// fim do método credit

// retorna o saldo da conta
public double getBalance()
{
	return balance;	// fornece o valor de saldo ao método chamador
}	// fim do método getBalance

} // fim da classe Account[/color]

Quando eu mando compilar ele funciona sem problema algum. Mas quando eu executo o programa e digito algum valor ponto flutuanate ele me dá uma mensagem de erro:

Enter deposit for account1: 25,36

Exception in thread main java.util.UnknownFormatConversionException: Conversion = 3at java.util.Formatter.checkText(Unknown Source)

at java.util.Formatter.parse(Unknown Source)

at java.util.Formatter.format(Unknown Source)

at java.io.PrintStream.format(Unknown Source)

at java.io.PrintStream.printf(Unknown Source)

at AccountTest.main(AccountTest.java:25)

7 Respostas

SadNess

não seria 25.36?

V

Eu já tentei tanto com 25.36 quanto 25.36 e dá o mesmo erro. e mesmo que coloque algum número inteiro ele dá erro.

David

Um erro bem interessante, vou explicar porque ele está acontecendo. Primeiro, um teste:

DecimalFormatSymbols dfs = new DecimalFormatSymbols();
System.out.println("Separador decimal: " + dfs.getDecimalSeparator());
System.out.println("Separador de Grupos: " + dfs.getGroupingSeparator());

Acrescente isso no seu código e veja o que ele imprime. Creio que a saida será , (vírgula) no primeiro caso e . (ponto) no segundo, estou certo? Isso é porque o método nextDouble() leva em considerações as informações de Locale (localização) e como o seu computador está no Brasil, o separador decimal é vírgula, e não ponto, e o separador de grupos é ponto, e não vírgula.

Portanto, a entrada correta para o seu programa seria 25,36 (vinte e cinco vírgula trinta e seis). Mas mesmo assim ocorrerá um erro depois:

Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '2'
	at java.util.Formatter.checkText(Formatter.java:2500)
	at java.util.Formatter.parse(Formatter.java:2482)
	at java.util.Formatter.format(Formatter.java:2411)
	at java.io.PrintStream.format(PrintStream.java:899)
	at java.io.PrintStream.printf(PrintStream.java:800)
	at AccountTest.main(AccountTest.java:25)

Esse erro está nessa linha:

System.out.printf("\nadding %2.f to account1 balance\n\n", depositAmount);

E aconteceu porque o certo seria %.2f, para formatar um double usando duas casas decimais, e não %2.f (ele não reconhece esse padrão).

Faça essas modificações que o seu programa deve funcionar.

C

Pouco tarde,

estou na luta para aprender JAVA básico através deste mesmo livro e estou com o mesmo problema, ja fiz o que os camaradas disseram, porém o erro persiste.

Como posso resolver???

ajudem por favor

paulohnt

caspersantos:
Pouco tarde,

estou na luta para aprender JAVA básico através deste mesmo livro e estou com o mesmo problema, ja fiz o que os camaradas disseram, porém o erro persiste.

Como posso resolver???

ajudem por favor

O deitel que vocês se referem é a 8 edição?

To no trampo agora, mas chegando em casa vou verificar esse exercício. Não lembro de ter ocorrido erro algum ao passar por esse capítulo.

E como o Dadiv falou, o correto seria %.2f, e não %2.f.

Um exemplo teste:

public class MainTeste {
  public static void main(String args[]) throws Exception {
    System.out.printf("num is %.2f\n", Math.PI );
  }
}
C

valew paulohnt,

consegui eliminar o erro…

F

Bom… Estive procurando sobre o erro. Foi solucionado. Lembrando que o formato correto é %.2f e não %2.f. No livro os exemplos estão corretos.

E quanto a colocação de vírgula ou ponto, no programa deve-se colocar vírgula.

Criado 30 de março de 2006
Ultima resposta 17 de jul. de 2011
Respostas 7
Participantes 6