So I'm making a payroll application and ran into a problem. Every time I go to run it, it comes up with a stackoverflow error. I can't seem to find out the error. I have been stuck on the problem for a while but any help would be much appreciated. I commented out the mainform variable on assign bonus and it seemed to work but i need that variable to get back to other forms.
Exception in thread "main" java.lang.StackOverflowError
at sun.awt.CGraphicsConfig.nativeGetBounds(Native Method)
at sun.awt.CGraphicsConfig.getBounds(CGraphicsConfig.java:56)
at java.awt.Window.init(Window.java:505)
at java.awt.Window.<init>(Window.java:537)
at java.awt.Frame.<init>(Frame.java:420)
at java.awt.Frame.<init>(Frame.java:385)
at javax.swing.JFrame.<init>(JFrame.java:189)
at oca.project.MainForm.<init>(MainForm.java:91)
at oca.project.AssignBonusForm.<init>(AssignBonusForm.java:80)
at oca.project.MainForm.<init>(MainForm.java:22)
main class
package oca.project;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class OCAProject {
static ArrayList<Person> persons = new ArrayList<>();
public static void main(String[] args) {
CEO JamesMint = new CEO();
//making objects
AdministrationManager BillJohns = new AdministrationManager(JamesMint);
FinancialAdministrator EricWhite = new FinancialAdministrator(JamesMint);
persons.add(JamesMint);
persons.add(BillJohns);
persons.add(EricWhite);
//declaring form and passing arraylist as parameter
MainForm frame = new MainForm(persons);
frame.setVisible(true);
}
}
mainframe class
package oca.project;
import java.util.ArrayList;
public class MainForm extends javax.swing.JFrame {
//array list to hold the report items
private ArrayList<PayrollReportItem> payRolllist = new ArrayList<>();
AssignBonusForm assignFrame = new AssignBonusForm(payRolllist);
void setList(ArrayList<Person> persons) {
//sets arraylist
assignFrame.setPersons(persons);
}
public MainForm(ArrayList<Person> persons) {
initComponents();
setList(persons);
}
private void btnAssignBonusActionPerformed(java.awt.event.ActionEvent evt) {
//to open assign bonus form
assignFrame.setVisible(true);
this.dispose();
}
assign bonus form
package oca.project;
import java.util.ArrayList;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
/**
*
* Form that allows managers assign bonuses to their subordinates
*/
public class AssignBonusForm extends javax.swing.JFrame {
static ArrayList<Person> persons = new ArrayList<>();
/**
* Creates new form AssignBonusForm
* @param payRolllist
*/
public AssignBonusForm(ArrayList<PayrollReportItem> payRolllist) {
initComponents();
System.out.println(persons);
}
private AssignBonusForm() {
}
public void setPersons(ArrayList<Person> persons) {
AssignBonusForm.persons = persons;
}
public ArrayList<Person> getPersons() {
return persons;
}
MainForm form = new MainForm(persons);
private void btnBackActionPerformed(java.awt.event.ActionEvent evt) {
form.setVisible(true);
this.dispose();
}
It's hard to tell with the poor formatting, but, doesn't this seem a bit odd to you?
public class MainForm
...
AssignBonusForm assignFrame = new AssignBonusForm(payRolllist);
public class AssignBonusForm
...
MainForm form = new MainForm(persons);
What do you think will happen when you create a new MainForm
which creates a new AssignBonusForm
which creates a new MainForm
which creates a new AssignBonusForm
which creates a new MainForm
which creates a new AssignBonusForm
which creates a new MainForm
which creates a new AssignBonusForm
which creates a new MainForm
which creates a new ...
You can see this right in your stacktrace:
...
at oca.project.MainForm.<init>(MainForm.java:91)
at oca.project.AssignBonusForm.<init>(AssignBonusForm.java:80)
at oca.project.MainForm.<init>(MainForm.java:22)
Why is MainForm
in there twice?