【问题标题】:Saved in ArrayLists but wrong output write in a file保存在 ArrayLists 但错误的输出写入文件
【发布时间】:2025-11-22 10:05:01
【问题描述】:

您能否告知我下面的代码缺少什么?我的代码正在运行,但它没有写入文件。通过文本字段输入 where。以下是我所拥有的。

public class JFrameNewAccount extends javax.swing.JFrame {

 ArrayList<BankAccount> list = new ArrayList<BankAccount>();
 BankAccount account = new BankAccount();


public JFrameNewAccount() {
    initComponents();



 }
private void btnSaveAActionPerformed(java.awt.event.ActionEvent evt) {
account.setAccountName(txt_accountname.getText());
account.setAccountNo(txt_accountnumber.getText()); 

String fileName = "bank.txt";
    FileWriter file = null;

    try {
        file = new FileWriter(fileName,true);
        PrintWriter pw = new PrintWriter(file);
        for(BankAccount str: list) {
            pw.println(str);
        }

       pw.flush();
       pw.println("\n");


    } catch(FileNotFoundException ex) {
       JOptionPane.showMessageDialog(this, "Can't create your account!");

    } catch (IOException ex) {
        Logger.getLogger(JFrameNewAccount.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
       try {
           file.close();
       } catch (IOException ex) {
           Logger.getLogger(JFrameNewAccount.class.getName()).log(Level.SEVERE, null, ex);
       }
    }

请指教。

【问题讨论】:

  • 我没有看到代码,它将BankAccount 对象添加到list..
  • 你能给我举个例子吗?
  • 您的list 似乎是空的。将 backAccount 添加到列表中。list.add(backAccount);
  • 它打印错误的输出:它在文件上打印:finalassignment.BankAccount@b80017 当我尝试使用 list.add(BankAccount); 时它给了我一个错误; account.setAccountName(txt_accountname.getText()); account.setAccountNo(txt_accountnumber.getText()); list.add(account);
  • 你能用上面的评论更新问题吗?

标签: java swing arraylist textfield


【解决方案1】:

您下次应该尝试发布SSCCE

您的问题是您创建了一个 ArrayList(即“list”),为 ArrayList 创建了一个对象(即“account”),向该对象添加了数据(通过调用 setAccountName 和 setAccountNo)并尝试将 ArrayList 中的所有内容写入文件中。

在任何时候,您都没有将对象设置到 ArrayList 中。

我假设您正在尝试创建一个框架,将屏幕上的数据设置到文件中。如果是这样,这就是我要做的。 (更改在 ActionPerformed 的第 1 行和第 4 行)

注意:我不会清理你的代码(如果我可以挑剔的话,我会写得有点不同)。响应的重点是向您展示为什么您的代码不起作用,这就是问题所在。

public class JFrameNewAccount extends javax.swing.JFrame {

    private List<BankAccount> list = new ArrayList<>();

    public JFrameNewAccount() {
        initComponents();
    }

    private void btnSaveAActionPerformed(java.awt.event.ActionEvent evt) {
        BankAccount account = new BankAccount();
        account.setAccountName(txt_accountname.getText());
        account.setAccountNo(txt_accountnumber.getText()); 
        list.add(account);

        String fileName = "bank.txt";
        FileWriter file = null;

        try {
            file = new FileWriter(fileName,true);
            PrintWriter pw = new PrintWriter(file);
            for(BankAccount str: list) {
                pw.println(str);
            }

           pw.flush();
           pw.println("\n");
        } catch(FileNotFoundException ex) {
           JOptionPane.showMessageDialog(this, "Can't create your account!");
        } catch (IOException ex) {
            Logger.getLogger(JFrameNewAccount.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
           try {
               file.close();
           } catch (IOException ex) {
               Logger.getLogger(JFrameNewAccount.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

更新:刚刚看到你的评论。您的解决方案不会为您提供所需的输出,因为您正在尝试编写一个对象。您需要覆盖它的 toString。下面的示例

public class BankAccount {
    private String accountName;
    private String accountNumber;

    @Override
    public String toString() {
        return "Account Name: \"" + accountName + "\"" + System.getProperty("line.separator") + "Account Number: \"" + accountNumber + "\"";
    }

    // Setters and getters here
    public String getAccountName() {
        return accountName;
    }

    public String getAccountNumber() {
        return accountNumber;
    }

    public void setAccountName(String accountName) {
        this.accountName = accountName;
    }

    public void setAccountNumber(String accountNumber) {
        this.accountNumber = accountNumber;
    }
}

解释:Streams 只向它们写入字符串。如果您尝试将对象放入 System.out.println() 中,您将获得类似的 weird 输出。您看到的输出是 java 中 Object 类中实现的默认 toString() ,它显示了类名和对象的哈希码。您可以自定义 toString 或更改将对象写入文件的方式(通过内部调用 getter)或输出流(即 System.out.println())

更新 2:如果您想在每个字段之间使用新行来格式化它,您可以根据操作系统使用“\n”或“\r\n”。最好让 Java 决定哪一个可以工作。其中一种方法是使用System.getProperty("line.separator"),但this wonderful Stack Overflow post asking about platform independent new line characters 中列出了其他方法。

【讨论】:

  • 这太棒了!太感谢了!!!!!感谢您的提示!高度赞赏!!!!我在获取 accountType 时遇到问题;它在单选按钮中,我无法得到它。
  • 当我尝试为每个数据创建一个新行时,它给了我一个错误。如何使输出如下: Account No: 101 // 然后是新行 Accont Name: John // 然后是新行 Account Type: // 然后是新行 Initial Balance:
  • 根据您的要求更新了解决方案以添加新行。如果你喜欢一个解决方案,你应该接受它并投票(如果可以的话)。这是向那些花时间帮助你的人表示感谢的好方法:)
  • 你修改了哪一行?另外,如何接受并投票?,对不起,但我是新来的,我不知道如何接受它。嗯,我有一个后续问题,假设我有一个单选按钮(用于帐户类型、储蓄和支票),我怎样才能获得选定的按钮?我是否必须使用帐号和帐户名添加 getter 和 setter?
  • 接受答案的工作方式如上所述meta.stackexchange.com/questions/5234/…您可以通过单击您喜欢的帖子左侧的向上箭头为答案投票。如果您有特权,您只能执行此操作。至于你的第二个问题,我认为还有第二个帖子可供讨论。最好在那里回答。每个 * 问题都必须保持正常。不能跨帖子回答:)
最近更新 更多