Reputation: 49
Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException: / by zero at factoroperations.compute(factoroperations.java:21) at factorframe$buttonhandler.actionPerformed(factorframe.java:71) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:20 18) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav a:2341) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel .java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259 ) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL istener.java:252) at java.awt.Component.processMouseEvent(Component.java:6504) at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) at java.awt.Component.processEvent(Component.java:6269) at java.awt.Container.processEvent(Container.java:2229) at java.awt.Component.dispatchEventImpl(Component.java:4860) at java.awt.Container.dispatchEventImpl(Container.java:2287) at java.awt.Component.dispatchEvent(Component.java:4686) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832 ) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) at java.awt.Container.dispatchEventImpl(Container.java:2273) at java.awt.Window.dispatchEventImpl(Window.java:2713) at java.awt.Component.dispatchEvent(Component.java:4686) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) at java.awt.EventQueue.access$000(EventQueue.java:101) at java.awt.EventQueue$3.run(EventQueue.java:666) at java.awt.EventQueue$3.run(EventQueue.java:664) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo main.java:76) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo main.java:87) at java.awt.EventQueue$4.run(EventQueue.java:680) at java.awt.EventQueue$4.run(EventQueue.java:678) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo main.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:677) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre ad.java:211) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread. java:128) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre ad.java:117) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
//Project: A program that factors numbers
//This defines the properties of the user interface
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JLabel;
public class factorframe extends JFrame
{//declare all the variables
private JLabel integerlabel;
private JTextField integerfield;
private JLabel factorslabel;
private JTextField factorsfield;
private JLabel namelabel;
private JButton computebutton;
private JButton clearbutton;
private JButton exitbutton;
private String integerstring;
private long integer;
private String factorsstring;
private int factors;
private factoroperations factormachine;
public factorframe() //This is the constructor
{ //add all buttons and fields
super("Factor Frame");
setLayout(new FlowLayout());
namelabel = new JLabel("Integer Factorization By Michael Daigh");
add(namelabel);
integerlabel = new JLabel("Enter an integer:");
add(integerlabel);
integerfield = new JTextField(20);
add(integerfield);
factorslabel = new JLabel("The factors are:");
add(factorslabel);
factorsfield = new JTextField(20);
add(factorsfield);
computebutton = new JButton("Compute Factors");
add(computebutton);
clearbutton = new JButton("Clear");
add(clearbutton);
exitbutton = new JButton("Exit");
add(exitbutton);
buttonhandler myhandler = new buttonhandler();
computebutton.addActionListener(myhandler);
clearbutton.addActionListener(myhandler);
exitbutton.addActionListener(myhandler);
factormachine = new factoroperations();
}//End of constructor method
private class buttonhandler implements ActionListener
{public void actionPerformed(ActionEvent event)
{
if(event.getSource() == computebutton)//if user clicks compute factors
{//computes the factors of the number
integerstring = integerfield.getText();//get the number
integer = Long.parseLong(integerstring);
factorsstring = factoroperations.compute(integer);
factorsfield.setText(factorsstring);//display the factors
}
else if(event.getSource() == clearbutton)//if user clicks clear
{//clears all data in integer field and factor field
integer=0;
integerfield.setText("");
factors=0;
factorsfield.setText("");
}
else if(event.getSource() == exitbutton)//if user clicks exit
{//exits the program
System.exit(0);
}
else
System.out.println("Unknown error");
}//End of actionPerformed
}//End of buttonhandler class
}//End of factorframe class
//Project: A program that factors numbers
//This contains the algorithm used by this project.
public class factoroperations
{
public static String compute(long integer)
{
String factor="";//initialize the factor string
int check = 1;//initialize the prime check
for(int i=2; i<=integer/2; i++)
{
if(integer%i==0)//i is a factor of the number
{
for(int k=2; k<i; k++)//check if it is prime
{
if(i%k ==0)
{
check = 1;
break;
}
else
check = 0;
}
if(check == 0 || i == 2)//display the prime factors only
{
factor = factor + " " + i + "P";
}
else if(check == 1)//display all other factors
factor = factor + " " + i;
}
}
if(factor == "")//if number does not factor, it is already prime
{
factor = "No factors. It is a prime number";
}
return factor;
}
}//End factoroperations class
//Project: A program that factors numbers
//This activates the user interface.
import javax.swing.JFrame;
public class testfactor
{public static void main(String[] args)
{factorframe myframe = new factorframe();
myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myframe.setSize(325,225);
myframe.setVisible(true);
}//End of main
}//End of class testfactor
Upvotes: 2
Views: 3701
Reputation: 285403
You're getting int overflow and are dividing by 0. While the integer
parameter is a long, your i is an int and it will overflow if it tries to increment to match the size of the large long parameter, and when it overflows, its value can be 0, negative, or lord knows what.
One possible solution: your for loop indices should both be longs, not ints.
Also, for what it's worth, it's quite confusing giving a long parameter or variable the name integer
!
Upvotes: 5
Reputation: 7326
You never divide by 0, so it shouldn't produce this error, something is messed up here. However, I'd like to point out a few things to fix:
long
integer; this is just plain stupid. Give it a more meaningful name, such as numberToFactor
or just number
.if(factor == "")
": Use if(factor.equals(""))
instead, you must use .equals
on strings rather than ==
StringBuilder
; you can use this to make your code more efficient with all that string concatenation in your for loops.EDIT: With this new info from your comment, Hovercraft is right. Change your loop counters to be of the type long
just like your number to factor. If they are int's, when they hit 2^31-1 (maximum int value), they will cause errors. Using a long however give's more memory to the number, allowing it to be larger.
Upvotes: 3