Problema com package no netbeans 6.01

4 respostas
sk2ck

Pessoal, eu criei um package através do netbeans com o seguinte caminho com\deitel\jhtp6\ch14… dentro dele inclui a seguinte classe:

package com.deitel.jhtp6.ch14; // empacotada para reutilização

public class AccountRecord 
{
    private int account;
    private String firstName;
    private String lastName;
    private double balance;
    
    // construtor sem argumentos chama outro construtor com valores-padrão
    public AccountRecord()
    {
        this(0, "", "", 0.0);
    }
    
    // inicializa um registro
    public AccountRecord(int acct, String first, String last, double bal)
    {
        setAccount(acct);
        setFirstName(first);
        setLastName(last);
        setBalance(bal);
    }
    
    // configura o número de conta
    public void setAccount(int acct)
    {
        System.out.println("Essa frase verifica se o método esta funcionado!!!");    // Aqui esta a frase teste!!!! Mas que na verdade não exibe a frase!!!
        account = acct;
    }
    
    public int getAccount()
    {
        return(account);
    }
    
    // configura o nome
    public void setFirstName(String first)
    {
        firstName = first;
    }
    
    public String getFirstName()
    {
        return(firstName);
    }
    
    // configura o sobrenome
    public void setLastName(String last)
    {
        lastName = last;
    }
    
    public String getLastName()
    {
        return(lastName);
    }
    
    // configura o saldo
    public void setBalance(double bal)
    {
        balance = bal;
    }
    
    public double getBalance()
    {
        return(balance);
    }
}

aparentemente não houve nenhuma indicação de erro pelo netbeans…

ae, eu uso essa classe nessa outra aqui:

import java.io.FileNotFoundException;
import java.lang.SecurityException;
import java.util.Formatter;
import java.util.FormatterClosedException;
import java.util.NoSuchElementException;
import java.util.Scanner;

import com.deitel.jhtp6.ch14.AccountRecord;

public class CreateTextFileb
{
    private Formatter output; // objeto utilizado para gerar
    
    // permite ao usuário abrir o arquivo
    public void openFile()
    {
        try
        {
            output = new Formatter("clients.txt");
        }
        catch(SecurityException securityException)
        {
            System.err.println("Você não tem acesso a escrita nesse arquivo");
            System.exit(1);
        }
        catch(FileNotFoundException filesNotFoundException)
        {
            System.err.println("Erro ao criar o arquivo");
            System.exit(1);
        }
    }
    
    // adiciona registros ao arquivo
    public void addRecords()
    {
        // objeto a ser gravdo no arquivo
        AccountRecord record = new AccountRecord();
        
        Scanner input = new Scanner(System.in);
        
        System.out.printf("%s\n%s\n%s\n%s\n\n", 
                "To terminate input, type the ebd-of-file indicator",
                "when you are prompted to enter input.",
                "On UNIX/Linux/Mac OS X type <ctrl> d then press Enter",
                "On Windows type <ctrl> z then press Enter");
        
        System.out.printf("%s\n%s", "Enter account number (>0), fisrt name, last name and balance.",
                "?");
        
        while(input.hasNext()) // faz um loop até o indicator de fim de arquivo
        {
            try // gera saída dos valores para o arquivo
            {
                // recupera os dados para saída
                record.setAccount(input.nextInt());
                record.setFirstName(input.next());
                record.setLastName(input.next());
                record.setBalance(input.nextDouble());
                
                if(record.getAccount() > 0)
                {
                    // grava um novo registro
                    output.format("%d %s %s %.2f\n", record.getAccount(),
                            record.getFirstName(), record.getLastName(),
                            record.getBalance());
                }
                else
                {
                    System.out.println("Numero da conta deve ser maior do que 0");
                }
            }
            catch(FormatterClosedException formatterClosedException)
            {
                System.err.println("Erro ao escrever no arquivo");
                return;
            }
            catch(NoSuchElementException elementException)
            {
                System.err.println("Entrada invalida. Por favor tente de novo.");
                input.nextLine();
            }
            
            System.out.printf("%s %s\n%s", "Entre o numero da conta (>0)",
                    "first name, last name and balance.", "? ");
        }
    }
    
    // fecha o arquivo
    public void closeFile()
    {
        if(output != null)
        {
            output.close();
        }
    }
}

Acontece que quando eu rodo o aplicativo, o arquivo “clients.txt” até é criado, mas não é gravado absolutamente nada dentro. Eu coloquei uma frase de teste dentro de um dos métodos da classe AccountRecord e verifiquei que essa frase não é exibida, o que me leva a pensar que o método tb não esta funcionando. Estou crendo que o problema esta na empacotação, mas não consigo saber como? Algúem consegue ver algum erro sutil na empacotação ou em outra parte???

4 Respostas

Daniel_Reis

Olá, bom acredito que seja algo no seu main, testei aqui e está correto...

o resultado foi:

Enter account number (>0), fisrt name, last name and balance. ? 1 Essa frase verifica se o método esta funcionado!!!

No meu main:

package teste;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
      
        CreateTextFileb c = new CreateTextFileb();
        c.addRecords();
     
        
    }

}

:thumbup:

sk2ck

Ae pessoal, eu entendi o problema agora… Eu fiz o seguinte… depois de testar e verificar que com o código não tinha problemas, tentei fazer tudo no Eclipse (Europa). Funcionou!!! Acontece que enquanto eu estou inserindo os dados, o arquivo aparece criado na pasta, mas esta sem conteúdo nenhum, assim como acontecia no Netbeans. Mas quando eu aperto + z no eclipse, o programa encerra e o conteúdo é gravado no arquivo sim!!! Acontece que no Netbeans, quando eu apertava + z, não encerrava a aplicação com um caracter de final de arquivo. Eu tinha que precionar o botão de parar compilação… ai a condição não era satisfeita e portanto não gravava a informação. Bom… ainda continuo sem solução no netbeans logo que + z não esta funcionando para inserir um caracter de fim de arquivo, mas pelo menos eu sei o por que e sei tb que o codigo esta funcionando. Gostaria agora de perguntar se alguém sabe que teclas devo inserir no netbeans para obter um caracter de fim de arquivo, o que iria resolver meu problema no netbeans.

T

O caracter ^Z, que indica o final de um arquivo-texto no MS-DOS, não é mais necessário há centenas de anos no Windows (ainda mais no Java, que nasceu no mundo Unix, onde tal caracter de fim de arquivo não existe e não é nem interpretado pelas rotinas do Java).

O que provavelmente você não está fazendo é chamar o método closeFile() da classe CreateTextFileb; isso é indispensável senão os últimos kbytes de dados escritos em um arquivo não serão efetivados (se seu arquivo for muito pequeno, por exemplo, os dados nunca serão gravados corretamente no arquivo-texto.)

sk2ck

Estou chamando sim thingol… creio que tem a ver com o caracter mesmo, por que no eclipse funcionou apertando + z. Ae vai o codigo do aplicativo, que mostra que estou chamando o metodo closeFile():

public class CreateTextFileTestb 
{
    public static void main(String args[])
    {
        CreateTextFileb application = new CreateTextFileb();
        
        application.openFile();
        application.addRecords();
        application.closeFile();
    }
}
Criado 19 de fevereiro de 2008
Ultima resposta 19 de fev. de 2008
Respostas 4
Participantes 3