jfreechart stürzt bei Verwendung von Yahoo Finance Quotes ab

BEHOBENE FRAGE: Die Lösung wechselt zu JFreeChart v1.0.15

Ich habe ein sehr eigenartiges Problem.

Was ich eingerichtet habe, ist eine Datei, die eine URL-Anfrage an die Yahoo Finance-Website sendet und dann die Ergebnisse verwendet, um ein JFreeChart in einem JFrame zu zeichnen.

Was ich einfach nicht verstehen kann, ist Folgendes:

Bei bestimmten URL-Anforderungen stürzt der JFrame ab

Es startet, zeigt aber nur einen weißen Bildschirm. Während für andere Anfragen mein Programm gut funktioniert.

Beispiel

Zum Beispiel:

Diese Anfrage:

"http://ichart.yahoo.com/table.csv?s=GOOG&a=0&b=1&c=2011&d=6&e=24&f=2013&g=d&ignore=.csv";

funktioniert gut.

Aber diese Bitte:

"http://ichart.yahoo.com/table.csv?s=GOOG&a=2&b=1&c=2012&d=6&e=24&f=2013&g=d&ignore=.csv";

verursacht einen Fehler.

Wie ist das möglich?

Hinweis

Ich kenne folgendes:

JFrame stürzt ab, aber JVM merkt nichts davon (merkt nicht, dass es abstürzt)Das Herunterladen der Börsenkurse (die Informationen, die JFreeChart verwendet) ist in beiden Fällen perfektDer Code zum Herunterladen und Anzeigen der Daten in JFreeChart stammt vonDiese Seite (der Code vonRoyW »Sa, 10. Mai 2008, 7:52 Uhr).Die Menge der eingehenden Daten scheint kein Problem zu sein, da in Anforderung 1 mehr Datenpunkte als in Anforderung 2 vorhanden sindDie Art und Weise, wie ich die Daten herunterlade, spielt keine Rolle (ich habe versucht, beide direkt von der URL zu lesen und die zu speichern).csv Datei in einen Ordner und dann aus dem Ordner lesen)Das Problem tritt nicht zufällig auf: Ich habe mehrfach versucht, den JFrame zu starten (den Code neu zu kompilieren und dann auszuführen), aber das "falsche" Zitat stürzt den JFrame jedes Mal ab.Zusatzinformation

Das könnte etwas damit zu tun haben:

Wenn ich den Graphen mit einem korrekten Zitat starte und den Graphen herum ziehe, passiert etwas Seltsames. In bestimmten Abständen, so scheint es, werden die Kerzen an jedem Wochenende immer kleiner, bis sie nur noch ein Streifen sind. Wenn ich dann über das Wochenende ziehe, werden sie wieder dicker, bis sie wieder die normale Größe haben. Dies scheint für jedes Wochenende zu passieren. Beachten Sie die folgenden Bilder:

Deshalb habe ich gedacht, dass es etwas damit zu tun haben könnteHandelstage. Aber das ergibt auch keinen Sinn, weil1.1.2011 (Bitte 1) fällt auf einen Samstag und01.03.2012 (Anfrage 2) fällt an einem Donnerstag, während Anfrage 1 erfolgreich war und Anfrage 2 fehlgeschlagen ist.

Ich habe absolut keine Ahnung, was ich tun soll.

Alle helfen sehr dankbar.

Aktualisieren

Auf Anfrage ist hier dasSSCCE mittrashgodVorschläge von (mit JFreechart lib v1.0.14).

    import org.jfree.chart.*;
    import org.jfree.chart.axis.*;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.CandlestickRenderer;
    import org.jfree.data.xy.*;

    import javax.swing.*;
    import java.awt.*;
    import java.io.*;
    import java.net.URL;
    import java.text.*;
    import java.util.*;
    import java.util.List;

    public class CandlestickDemo2 extends JFrame {
        public CandlestickDemo2(String stockSymbol) {
            super("CandlestickDemo");
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            DateAxis    domainAxis       = new DateAxis("Date");
            NumberAxis  rangeAxis        = new NumberAxis("Price");
            CandlestickRenderer renderer = new CandlestickRenderer();
            XYDataset   dataset          = getDataSet(stockSymbol);

            XYPlot mainPlot = new XYPlot(dataset, domainAxis, rangeAxis, renderer);

            //Do some setting up, see the API Doc
            renderer.setSeriesPaint(0, Color.BLACK);
            renderer.setDrawVolume(false);
            rangeAxis.setAutoRangeIncludesZero(false);
            domainAxis.setTimeline( SegmentedTimeline.newMondayThroughFridayTimeline() );

            //Now create the chart and chart panel
            JFreeChart chart = new JFreeChart(stockSymbol, null, mainPlot, false);
            ChartPanel chartPanel = new ChartPanel(chart, false);
            chartPanel.setPreferredSize(new Dimension(600, 300));

            this.add(chartPanel);
            this.pack();
        }
        protected AbstractXYDataset getDataSet(String stockSymbol) {
            //This is the dataset we are going to create
            DefaultOHLCDataset result = null;
            //This is the data needed for the dataset
            OHLCDataItem[] data;

            //This is where we go get the data, replace with your own data source
            data = getData(stockSymbol);

            //Create a dataset, an Open, High, Low, Close dataset
            result = new DefaultOHLCDataset(stockSymbol, data);

            return result;
        }
        //This method uses yahoo finance to get the OHLC data
        protected OHLCDataItem[] getData(String stockSymbol) {
            List<OHLCDataItem> dataItems = new ArrayList<OHLCDataItem>();
            try {
                String strUrl= "http://ichart.finance.yahoo.com/table.csv?s=GOOG&a=2&b=1&c=2012&d=6&e=24&f=2013&g=d&ignore=.csv";
                URL url = new URL(strUrl);
                BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
                DateFormat df = new SimpleDateFormat("y-M-d");

                String inputLine;
                in.readLine();
                while ((inputLine = in.readLine()) != null) {
                    StringTokenizer st = new StringTokenizer(inputLine, ",");

                    Date date       = df.parse( st.nextToken() );
                    double open     = Double.parseDouble( st.nextToken() );
                    double high     = Double.parseDouble( st.nextToken() );
                    double low      = Double.parseDouble( st.nextToken() );
                    double close    = Double.parseDouble( st.nextToken() );
                    double volume   = Double.parseDouble( st.nextToken() );
                    double adjClose = Double.parseDouble( st.nextToken() );

                    OHLCDataItem item = new OHLCDataItem(date, open, high, low, close, volume);
                    dataItems.add(item);
                }
                in.close();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            //Data from Yahoo is from newest to oldest. Reverse so it is oldest to newest
            Collections.reverse(dataItems);

            //Convert the list into an array
            OHLCDataItem[] data = dataItems.toArray(new OHLCDataItem[dataItems.size()]);

            return data;
        }

        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new CandlestickDemo2("GOOG").setVisible(true);
                }
            });
        }
    }

Dadurch wird ein JFrame generiert, der nur einen weißen Bildschirm anzeigt. Versuchen Sie das zu ändernstrUrl zu

 "http://ichart.finance.yahoo.com/table.csv?s=GOOG&a=0&b=1&c=2011&d=6&e=24&f=2013&g=d&ignore=.csv";

und Sie werden feststellen, dass es gut funktioniert.

Aktualisieren

Ich habe es gelöst! Das Problem war die JFreeChart-Version. Das Ändern von v1.0.14 zu v1.0.15 löste alles. Ein großes Lob antrashgod für die (unwissentlich) Lösung meines Problems durch umfassende Beantwortungund Erwähnung der Bibliotheksversion gebraucht.

Weiß jemand, wie ich anderen helfen kann, die das gleiche Problem haben? Gibt es irgendwo ein Portal, auf dem ich diesen Fehler notieren kann?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage