import java.awt.*;
import java.awt.event.*;
import java.text.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.Arrays;
import java.io.*;
public class BankAccount extends JFrame {
// Make these variables publicly available
String file = ("THUS.txt");
public static String acctNumber ;
public static String custid , acctDateOpened;
public static double balance ;
private static final String EMPTY = "EMPTY";
boolean valid1, valid2, valid3, valid4, valid5, valid6, valid7 ;
int i = 1;
Account [] account = new Account [i] ;
// Setup Arrays for each account
// JPanel for user inputs
private JPanel inputDetailJPanel;
// JLabel and Jtext field for custID
private JTextField acctDateOpenedJTextField;
private JLabel acctDateOpenedJLabel;
// JLabel and Jtext field for custID
private JTextField custidJTextField;
private JLabel custidJLabel;
// JLabel and JTextField for account number
private JLabel acctNumberJLabel;
private JTextField acctNumberJTextField;
// JLabel and JTextField for balance
private JLabel balanceJLabel;
private JTextField balanceJTextField;
// JButton to create account
private JButton CreateAccountJButton;
//JButton for update
private JButton updateJButton ;
//JButton for update
private JButton interestJButton ;
//JButton to clear account
private JButton clearJButton ;
// JButton to delete account
private JButton DeleteAccountJButton;
// JLabel and JTextArea to display account details
private JLabel displayJLabel;
private JTextArea displayJTextArea;
// constructor
public BankAccount() {
createUserInterface();
}
// create and position GUI components; register event handlers
private void createUserInterface() {
// get content pane for attaching GUI components
Container contentPane = getContentPane();
// enable explicit positioning of GUI components
contentPane.setLayout(null);
// set up inputDetailJPanel
inputDetailJPanel = new JPanel();
inputDetailJPanel.setBounds(31, 31, 215, 273); // 3rd number controlds length , 4th width
inputDetailJPanel.setBorder(new TitledBorder("Account"));
inputDetailJPanel.setLayout(null);
contentPane.add(inputDetailJPanel);
// set up custIDJLabel
custidJLabel = new JLabel();
custidJLabel.setBounds(8, 32, 90, 23);
custidJLabel.setText("customer ID");
inputDetailJPanel.add(custidJLabel);
// set up cusidJTextField
custidJTextField = new JTextField();
custidJTextField.setBounds(104, 32, 88, 21);
custidJTextField.setHorizontalAlignment(JTextField.RIGHT);
inputDetailJPanel.add(custidJTextField);
// set up AccountnumJLabel
acctNumberJLabel = new JLabel();
acctNumberJLabel.setBounds(8, 56, 100, 23);
acctNumberJLabel.setText("Account Number:");
inputDetailJPanel.add(acctNumberJLabel);
// set up AccountnumTextField
acctNumberJTextField = new JTextField();
acctNumberJTextField.setBounds(112, 56, 80, 21);
acctNumberJTextField.setHorizontalAlignment(JTextField.RIGHT);
inputDetailJPanel.add(acctNumberJTextField);
// set up BalanceJLabel
balanceJLabel = new JLabel();
balanceJLabel.setBounds(8, 80, 60, 23);
balanceJLabel.setText("Balance:");
inputDetailJPanel.add(balanceJLabel);
// set up BalanceTextField
balanceJTextField = new JTextField();
balanceJTextField.setBounds(112, 80, 80, 21);
balanceJTextField.setHorizontalAlignment(JTextField.RIGHT);
inputDetailJPanel.add(balanceJTextField);
// set up DateJLabel
acctDateOpenedJLabel = new JLabel();
acctDateOpenedJLabel.setBounds(8, 100, 80, 24);
acctDateOpenedJLabel.setText("Date:");
inputDetailJPanel.add(acctDateOpenedJLabel);
// set up dateTextField
acctDateOpenedJTextField = new JTextField();
acctDateOpenedJTextField.setBounds(114, 105, 80, 21);
acctDateOpenedJTextField.setHorizontalAlignment(JTextField.RIGHT);
inputDetailJPanel.add(acctDateOpenedJTextField);
// set up CreateAccountButton
CreateAccountJButton = new JButton();
CreateAccountJButton.setBounds(112, 152, 80, 26);
CreateAccountJButton.setText("Create");
inputDetailJPanel.add(CreateAccountJButton);
CreateAccountJButton.addActionListener(
new ActionListener() {
// event handler called when CreateAccountJButton
// is clicked
public void actionPerformed(ActionEvent event) {
CreateAccountJButtonActionPerformed(event);
}
}
); // end call to addActionListener
// set up interesrAccountButton
interestJButton = new JButton();
interestJButton.setBounds(32, 238, 160, 28);
interestJButton.setText("intrest");
inputDetailJPanel.add(interestJButton);
interestJButton.addActionListener(
new ActionListener() {
// event handler called when interestAccountJButton
// is clicked
public void actionPerformed(ActionEvent event) {
interestJButtonActionPerformed(event);
}
}
); // end call to addActionListener
// set up DeleteAccountButton
DeleteAccountJButton = new JButton();
DeleteAccountJButton.setBounds(16, 152, 80, 24);
DeleteAccountJButton.setText("Delete");
inputDetailJPanel.add(DeleteAccountJButton);
DeleteAccountJButton.addActionListener(
new ActionListener() // anonymous inner class
{
// event handler called when DeleteAccountJButton
// is clicked
public void actionPerformed(ActionEvent event) {
DeleteAccountJButtonActionPerformed(event);
}
}
); // end call to addActionListener
// set up updateJButton
updateJButton = new JButton();
updateJButton.setBounds(16, 180, 176, 24);
updateJButton.setText("update Account ");
inputDetailJPanel.add(updateJButton);
updateJButton.addActionListener(
new ActionListener() // anonymous inner class
{
// event handler called when TransactionJButton
// is clicked
public void actionPerformed(ActionEvent event) {
updateJButtonActionPerformed(event);
}
} // end anonymous inner class
);
// clear Button
clearJButton = new JButton();
clearJButton.setBounds(18, 210, 176, 24);
clearJButton.setText("clear");
inputDetailJPanel.add(clearJButton);
clearJButton.addActionListener(
new ActionListener() // anonymous inner class
{
// event handler called when clearJButton
// is clicked
public void actionPerformed(ActionEvent event) {
clearJButtonListenerActionPerformed(event);
}
} // end anonymous inner class
);
// set up displayJLabel
displayJLabel = new JLabel();
displayJLabel.setBounds(250, 26, 190, 33);
displayJLabel.setText("Account Details:");
contentPane.add(displayJLabel);
// set up displayJTextArea
displayJTextArea = new JTextArea();
displayJTextArea.setBounds(260, 68, 422, 205);
displayJTextArea.setEditable(false);
contentPane.add(displayJTextArea);
// set properties of application's window
setTitle("Bank Accounts"); // set title bar string
setSize(750, 450); // set window size
setVisible(true); // display window
} // end method createUserInterface
private void CreateAccountJButtonActionPerformed(ActionEvent event) {
//invrement number in array
i++ ;
balance = Double.parseDouble(balanceJTextField.getText());
custid = custidJTextField.getText();
custid = custid.trim();
acctDateOpened = acctDateOpenedJTextField.getText();
acctDateOpened = acctDateOpened.trim();
acctNumber = acctNumberJTextField.getText();
acctNumber = acctNumber.trim();
// Check to see if each account array is populated and
// if not add account details
if (balance == 0 )
{
JOptionPane.showMessageDialog (null, "you initial balance cannot be zero ");
valid1 = false ;
}
else valid1 = true ;
if (balance < 0 )
{
valid2 = false;
JOptionPane.showMessageDialog (null, "Please enter a number for account balance!");
}
else valid2 = true;
DateTest test = new DateTest();
if (acctDateOpened.length() == 0 || test.isValidDate(acctDateOpened)== false)
{
JOptionPane.showMessageDialog (null, "Enter Account date in correct dd/mm/yyyy format");
valid3 = false;
}
else
valid3 = true;
if (custid.length() != 7)
{
JOptionPane.showMessageDialog (null, "Please enter apositive 7 digit id number");
valid4 = false;
}
else
valid4 = true;
//validate customer id number
for (int i = 0; i < custid.length(); i++)
{
if (!Character.isDigit(custid.charAt(i)))
{
valid5 = false;
JOptionPane.showMessageDialog (null, "Please enter a positive 7 digit id number");
}
else valid5 = true;
}
if (acctNumber.length() == 0)
{
JOptionPane.showMessageDialog (null, "Please enter an account number");
valid6 = false;
}
else
valid6 = true;
// validate account number is a number
for (int i = 0; i < acctNumber.length(); i++)
{
if (!Character.isDigit(acctNumber.charAt(i)))
{
valid7 = false;
JOptionPane.showMessageDialog (null, "Please enter a number for account number");
}
else valid7 = true;
}
if (valid1 == true && valid2 == true && valid3== true && valid4 ==true && valid5 == true && valid6 == true && valid7 == true )
{
try {
FileWriter fw = new FileWriter (file, true);
BufferedWriter bw = new BufferedWriter (fw);
PrintWriter outFile = new PrintWriter (bw);
account[i] = new Account ( acctNumber , balance , acctDateOpened , custid ) ;
outFile.println ("account number " + account[i].getacctNumber() );
outFile.println ("balance " + account[i].getBalance () );
outFile.println ("date opened " + account[i].getacctDate () );
outFile.println ("customer ID " + account[i].getcustid () );
outFile.println();
outFile.close();
JOptionPane.showMessageDialog (null, "Account has been saved at: " + file);
}
catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error: File not found");
}
displayJTextArea.setText( "Account Number \tcustomerID \tDate Of Opening \tbalance" + " \n " + account[i] + " " + account[i].getacctNumber() + " " + account[i].getBalance () + " " + account[i].getacctDate () + " " + account[i].getcustid () );
}
}
private void clearJButtonListenerActionPerformed(ActionEvent event)
{
custidJTextField.setText(" ");
acctDateOpenedJTextField.setText(" ");
acctNumberJTextField.setText(" ");
balanceJTextField.setText(" ");
}
private void interestJButtonActionPerformed(ActionEvent event)
{
double add = Double.parseDouble ( JOptionPane.showInputDialog ("enter percentage interest") ) ;
for (int i = 0; i < account.length; i++)
{
double B = account[i].getBalance();
double amount = (add/100) * B;
balance += amount ;
}
}
private void DeleteAccountJButtonActionPerformed(ActionEvent event) {
String D = JOptionPane.showInputDialog (null, "Please enter the account number to delete the account");
for ( int c = 0 ; c < account.length; c++ )
{
if( D.equals( account[i].getacctNumber()) )
{
JOptionPane.showMessageDialog (null , "FOUND");
account[i] = null ;
} else
{ JOptionPane.showMessageDialog (null, "NOT FOUND ");
}
}
}
private void updateJButtonActionPerformed(ActionEvent event) {
}
public static void main(String[] args) {
// Populate arrays with the word EMPTY
// so we can check to see if the values are empty later
BankAccount application = new BankAccount();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Jeun 0 Newbie Poster
Edited by mike_2000_17 because: Fixed formatting
Dani AI
Generated
Short diagnosis and what actually bit you: the UI message about "file not found" hid the real problem — your code was throwing an array/index error when you tried to store the new Account. was right to point at the resize issue: incrementing the counter without expanding the backing array (and later using the wrong index variable in loops) causes ArrayIndexOutOfBounds or null access, not a file write failure. To see the real exception, print the stack trace (or show the exception type/message) instead of always showing a generic dialog.
A cleaner, safer fix is to stop managing raw arrays and use a dynamic collection. Example (replace your class-level array and index logic with an ArrayList):
List<Account> accounts = new ArrayList<>();
// when creating a new account:
accounts.add(new Account(acctNumber, balance, acctDateOpened, custid));
// to iterate:
for (Account a : accounts) { /* use a.getBalance(), etc. */ } Two small but critical fixes seen in the thread: your Account constructor assigns the date backwards, leaving the field null; use explicit this. assignment so fields actually get the constructor values:
public Account(String acctNum, double bal, String date, String custid) {
this.acctNumber = acctNum;
this.balance = bal;
this.dateOpened = date;
this.custID = custid;
} Other practical tips:
- Don’t reuse the field name
iinside loops (shadowing confuses logic); use local loop variables or remove the class-level counter. - In delete/search/interest loops use the loop index (or for-each) and null-check entries before calling methods.
- Wrap numeric parsing in try/catch to avoid NumberFormatException.
- For file debugging, show new File(file).getAbsolutePath() so you know where output was written; use try-with-resources for safe close and print the real exception message instead of a catch-all.
These changes address the index/null bugs and will make the file-write issue disappear once the in-memory data is stable.
Recommended Answers
Jump to Post— moutanna 2You provide no information about testDate and Acount
Jump to Post— moutanna 2The exception you got is not about the file but in fact it's an ArrayIndexOutOfBoundsException; but the message you show is your's.
Try to depect the incremetation of th i value.
Hope it helps.
Jump to Post— moutanna 2You increse the value of i without incresing the size of the account array.
That is the error.
All 9 Replies
moutanna 2 Posting Whiz
You provide no information about testDate and Acount
Jeun 0 Newbie Poster
You provide no information about testDate and Acount
/////////////////////////account class\\\\\\\\\\\\\\\\\\\\\\\\\\
public class Account {
// Instance variable
private double balance;
String acctNumber ;
String dateOpened;
String custID ;
int amountInArray;
// Constructor 1 (for initial deposit accounts)
public Account(String acctNum , double bal , String date , String custid) {
acctNumber = acctNum;
balance = bal ;
date = dateOpened ;
custID = custid ;
}
// Constructor 2 (for initially empty accounts)
public Account() {
balance = 0.0;
}
// Instance methods:
//deposit to account
public void deposit(double amount) {
balance += amount;
}
//withdraw from account
public void withdraw(double amount) {
balance -= amount;
}
//get the account number
public String getacctNumber() {
return acctNumber;
}
//get the account number
public String getcustid() {
return custID;
}
//get account balance
public double getBalance() {
return balance;
}
public String getacctDate() {
return dateOpened;
}
//close account
public void close() {
balance = 0.0;
}
}
////////////////////////////TestDate class\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
import java.text.SimpleDateFormat;
import java.text.ParseException;
public class DateTest {
public boolean isValidDate(String inDate) {
if (inDate == null)
return false;
//set the format to use as a constructor argument
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
if (inDate.trim().length() != dateFormat.toPattern().length())
return false;
dateFormat.setLenient(false);
try {
//parse the inDate parameter
dateFormat.parse(inDate.trim());
}
catch (ParseException pe) {
return false;
}
return true;
}
}
Edited by mike_2000_17 because: Fixed formatting
moutanna 2 Posting Whiz
The exception you got is not about the file but in fact it's an ArrayIndexOutOfBoundsException; but the message you show is your's.
Try to depect the incremetation of th i value.
Hope it helps.
moutanna 2 Posting Whiz
You increse the value of i without incresing the size of the account array.
That is the error.
Jeun 0 Newbie Poster
You increse the value of i without incresing the size of the account array.
That is the error.
I thought by increasing "i" i was increasing the size of the array , if its not too much trouble could u correct the error and copy and past it and show me please ?
moutanna 2 Posting Whiz
Add those instructions after increasing i and let me now!
Account [] newaccount = new Account [i] ;
System.arraycopy(account, 0, newaccount, 0, account.length);
account=newaccount; Jeun 0 Newbie Poster
System.arraycopy(account, 0, newaccount, 0, account.length);
thats gives an error
: <identifier> expected
and when if i put it after the i++ in the create listner it says variable account not found
moutanna 2 Posting Whiz
The whole function should look like:
private void CreateAccountJButtonActionPerformed(ActionEvent event) {
//invrement number in array
i++ ;
Account [] newaccount = new Account [i] ;
System.arraycopy(account, 0, newaccount, 0, account.length);
account=newaccount;
balance = Double.parseDouble(balanceJTextField.getText());
custid = custidJTextField.getText();
custid = custid.trim();
acctDateOpened = acctDateOpenedJTextField.getText();
acctDateOpened = acctDateOpened.trim();
acctNumber = acctNumberJTextField.getText();
acctNumber = acctNumber.trim();
// Check to see if each account array is populated and
// if not add account details
if (balance == 0 )
{
JOptionPane.showMessageDialog (null, "you initial balance cannot be zero ");
valid1 = false ;
}
else valid1 = true ;
if (balance < 0 )
{
valid2 = false;
JOptionPane.showMessageDialog (null, "Please enter a number for account balance!");
}
else valid2 = true;
DateTest test = new DateTest();
if (acctDateOpened.length() == 0 || test.isValidDate(acctDateOpened)== false)
{
JOptionPane.showMessageDialog (null, "Enter Account date in correct dd/mm/yyyy format");
valid3 = false;
}
else
valid3 = true;
if (custid.length() != 7)
{
JOptionPane.showMessageDialog (null, "Please enter apositive 7 digit id number");
valid4 = false;
}
else
valid4 = true;
//validate customer id number
for (int i = 0; i < custid.length(); i++)
{
if (!Character.isDigit(custid.charAt(i)))
{
valid5 = false;
JOptionPane.showMessageDialog (null, "Please enter a positive 7 digit id number");
}
else valid5 = true;
}
if (acctNumber.length() == 0)
{
JOptionPane.showMessageDialog (null, "Please enter an account number");
valid6 = false;
}
else
valid6 = true;
// validate account number is a number
for (int i = 0; i < acctNumber.length(); i++)
{
if (!Character.isDigit(acctNumber.charAt(i)))
{
valid7 = false;
JOptionPane.showMessageDialog (null, "Please enter a number for account number");
}
else valid7 = true;
}
if (valid1 == true && valid2 == true && valid3== true && valid4 ==true && valid5 == true && valid6 == true && valid7 == true )
{
try {
FileWriter fw = new FileWriter (file, true);
BufferedWriter bw = new BufferedWriter (fw);
PrintWriter outFile = new PrintWriter (bw);
account[i-1] = new Account ( acctNumber , balance , acctDateOpened , custid ) ;
outFile.println ("account number " + account[i-1].getacctNumber() );
outFile.println ("balance " + account[i-1].getBalance () );
outFile.println ("date opened " + account[i-1].getacctDate () );
outFile.println ("customer ID " + account[i-1].getcustid () );
outFile.println();
outFile.close();
JOptionPane.showMessageDialog (null, "Account has been saved at: " + file);
}
catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error: File not found");
}
//Account acc =account[i-1];
displayJTextArea.setText( "Account Number \tcustomerID \tDate Of Opening \tbalance" + " \n " + account[i-1] + " " + account[i-1].getacctNumber() + " " + account[i-1].getBalance () + " " + account[i-1].getacctDate () + " " + account[i-1].getcustid () );
}
} this is all the change i done.
Jeun 0 Newbie Poster
The whole function should look like:
private void CreateAccountJButtonActionPerformed(ActionEvent event) { //invrement number in array i++ ; Account [] newaccount = new Account [i] ; System.arraycopy(account, 0, newaccount, 0, account.length); account=newaccount; balance = Double.parseDouble(balanceJTextField.getText()); custid = custidJTextField.getText(); custid = custid.trim(); acctDateOpened = acctDateOpenedJTextField.getText(); acctDateOpened = acctDateOpened.trim(); acctNumber = acctNumberJTextField.getText(); acctNumber = acctNumber.trim(); // Check to see if each account array is populated and // if not add account details if (balance == 0 ) { JOptionPane.showMessageDialog (null, "you initial balance cannot be zero "); valid1 = false ; } else valid1 = true ; if (balance < 0 ) { valid2 = false; JOptionPane.showMessageDialog (null, "Please enter a number for account balance!"); } else valid2 = true; DateTest test = new DateTest(); if (acctDateOpened.length() == 0 || test.isValidDate(acctDateOpened)== false) { JOptionPane.showMessageDialog (null, "Enter Account date in correct dd/mm/yyyy format"); valid3 = false; } else valid3 = true; if (custid.length() != 7) { JOptionPane.showMessageDialog (null, "Please enter apositive 7 digit id number"); valid4 = false; } else valid4 = true; //validate customer id number for (int i = 0; i < custid.length(); i++) { if (!Character.isDigit(custid.charAt(i))) { valid5 = false; JOptionPane.showMessageDialog (null, "Please enter a positive 7 digit id number"); } else valid5 = true; } if (acctNumber.length() == 0) { JOptionPane.showMessageDialog (null, "Please enter an account number"); valid6 = false; } else valid6 = true; // validate account number is a number for (int i = 0; i < acctNumber.length(); i++) { if (!Character.isDigit(acctNumber.charAt(i))) { valid7 = false; JOptionPane.showMessageDialog (null, "Please enter a number for account number"); } else valid7 = true; } if (valid1 == true && valid2 == true && valid3== true && valid4 ==true && valid5 == true && valid6 == true && valid7 == true ) { try { FileWriter fw = new FileWriter (file, true); BufferedWriter bw = new BufferedWriter (fw); PrintWriter outFile = new PrintWriter (bw); account[i-1] = new Account ( acctNumber , balance , acctDateOpened , custid ) ; outFile.println ("account number " + account[i-1].getacctNumber() ); outFile.println ("balance " + account[i-1].getBalance () ); outFile.println ("date opened " + account[i-1].getacctDate () ); outFile.println ("customer ID " + account[i-1].getcustid () ); outFile.println(); outFile.close(); JOptionPane.showMessageDialog (null, "Account has been saved at: " + file); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error: File not found"); } //Account acc =account[i-1]; displayJTextArea.setText( "Account Number \tcustomerID \tDate Of Opening \tbalance" + " \n " + account[i-1] + " " + account[i-1].getacctNumber() + " " + account[i-1].getBalance () + " " + account[i-1].getacctDate () + " " + account[i-1].getcustid () ); } }this is all the change i done.
it works man u helped me so much!!! i wish i could make it up to u thanks!!!
Be a part of the DaniWeb community
We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.