构造函数必须调用super()或this()

时间:2013-09-30 10:18:03

标签: java compiler-errors

任何人都可以帮我处理以下错误报告(对于底部的代码):

Exception in thread "AWT-EventQueue-0" java.lang.VerifyError: Constructor must call super() or this() before return in method org.jfree.ui.RectangleInsets.<init>()V at offset 0
at org.jfree.chart.axis.Axis.<clinit>(Axis.java:153)
at org.jfree.chart.StandardChartTheme.<init>(StandardChartTheme.java:233)
at org.jfree.chart.StandardChartTheme.<init>(StandardChartTheme.java:319)
at org.jfree.chart.ChartFactory.<clinit>(ChartFactory.java:231)
at odesolver.ODESolver.createGraph(ODESolver.java:81)
at odesolver.ODESolver.<init>(ODESolver.java:35)
at odesolver.ODESolver$2.run(ODESolver.java:105)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
BUILD SUCCESSFUL (total time: 2 seconds)  

涉及以下3行代码:

ODESolver.java:81

JFreeChart chart = ChartFactory.createXYLineChart(

ODESolver.java:35

createGraph();

ODESolver.java:105

new ODESolver(); // Let the constructor do the job

整个计划:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package odesolver;

/**
 *
 * @author User
 */
import java.awt.*;       // Using AWT containers and components
import java.awt.event.*; // Using AWT events and listener interfaces
import javax.swing.*;    // Using Swing components and containers
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.ChartPanel;
import org.jfree.data.general.Series;

// A Swing GUI application inherits the top-level container javax.swing.JFrame
public class ODESolver extends JFrame {
   private JTextField tfInput, tfOutput;
   private int numberIn;   // input number
   private int sum = 0;    // accumulated sum, init to 0

   /** Constructor to setup the GUI */
   public ODESolver() {
      // Retrieve the content-pane of the top-level container JFrame
      // All operations done on the content-pane
      Container cp = getContentPane();
      cp.setLayout(new GridLayout(2, 2, 5, 5));

      createGraph();


      add(new JLabel("Enter an Integer: "));
      tfInput = new JTextField(10);
      add(tfInput);
      add(new JLabel("The Accumulated Sum is: "));
      tfOutput = new JTextField(10);
      tfOutput.setEditable(false);  // read-only
      add(tfOutput);

      // Allocate an anonymous instance of an anonymous inner class that
      //  implements ActionListener as ActionEvent listener
      tfInput.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            // Get the String entered into the input TextField, convert to int
            numberIn = Integer.parseInt(tfInput.getText());
            sum += numberIn;      // accumulate numbers entered into sum
            tfInput.setText("");  // clear input TextField
            tfOutput.setText(sum + ""); // display sum on the output TextField
         }
      });

      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // Exit program if close-window button clicked
      setTitle("ODE Accumulator"); // "this" Frame sets title
      setSize(350, 120);  // "this" Frame sets initial size
      setVisible(true);   // "this" Frame shows


   }

   private JPanel createGraph() {

        JPanel panel = new JPanel();
        XYSeries series = new XYSeries("MyGraph");
        series.add(0, 1);
        series.add(1, 2);
        series.add(2, 5);
        series.add(7, 8);
        series.add(9, 10);


        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series);

        JFreeChart chart = ChartFactory.createXYLineChart(
                "XY Chart",
                "x-axis",
                "y-axis",
                dataset, 
                PlotOrientation.VERTICAL,
                true,
                true,
                false
                );
        ChartPanel chartPanel = new ChartPanel(chart);


        panel.add(chartPanel);

        return panel;
    }

   /** The entry main() method */
   public static void main(String[] args) {
      // Run the GUI construction in the Event-Dispatching thread for thread-safety
      SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
            new ODESolver(); // Let the constructor do the job
         }
      });
   }
}

也许问题是ODESolver,src和lib中有文件存在错误,如netbeans报告(见下面的截图)。我不知道哪些文件有错误,因为它们都没有感叹号,因为它们通常会有错误。

netbeans error

3 个答案:

答案 0 :(得分:4)

您似乎正在运行旧版JFreeChart,这会产生此错误。升级到找到的here

版本1.0.13

答案 1 :(得分:0)

通过将jar文件添加到类路径而不是包含它们的文件夹

来解决问题

答案 2 :(得分:-1)

JFrame的各种构造函数执行重要的初始化工作,任何JFrame都需要。因此,每次创建的JFrame必须具有一个被调用的构造函数。但由于ODESolver也是JFrame,因此也适用于ODESolver个对象。

幸运的是,Java语言强制执行此操作。如果没有ODESolver构造函数被调用,我们就无法创建JFrame。它强制执行的方式是要求每个ODESolver构造函数都映射到JFrame构造函数。

当我们创建ODESolver时,其中一个ODESolver构造函数将被调用。但是该构造函数必须指定将调用哪个JFrame构造函数。它的方式是通过执行以下操作之一。

  • 通过调用JFrame明确指定要使用的super()构造函数,有或没有一些参数;
  • 通过调用ODESolver调用另一个this()构造函数,无论是否有一些参数。

在任何一种情况下,对super()this()的调用都必须是ODESolver构造函数的第一行。