2
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
4

2 に答える 2

5

intオーバーフローが発生し、0で除算されています。integerパラメーターがlongである間、iはintであり、大きなlongパラメーターのサイズに合わせてインクリメントしようとするとオーバーフローし、オーバーフローするとその値がオーバーフローします。 0、負、または主は何を知っている可能性があります。

考えられる解決策の1つ:forループのインデックスは両方ともintではなくlongである必要があります。

また、その価値については、長いパラメーターまたは変数に名前を付けるのは非常に混乱しますinteger

于 2012-09-15T02:25:47.427 に答える
3

0 で除算することはないため、このエラーは発生しないはずです。ここで何かがおかしくなっています。ただし、修正すべき点をいくつか指摘したいと思います。

  • long整数を呼び出さないでください。これはただのばかです。numberToFactorまたはなど、より意味のある名前を付けnumberます。
  • " if(factor == "")":if(factor.equals(""))代わりに使用.equalsします。==
  • を読んでくださいStringBuilder。これを使用して、for ループ内のすべての文字列連結でコードをより効率的にすることができます。

編集: あなたのコメントからのこの新しい情報で、Hovercraft は正しいです。ループ カウンターをlong因数分解する数値と同じタイプに変更します。それらが int の場合、2^31-1 (最大 int 値) に達すると、エラーが発生します。ただし、 long を使用すると、数値により多くのメモリが与えられ、数値を大きくすることができます。

于 2012-09-15T02:24:03.577 に答える