异常提示如下:
java.lang.IllegalArgumentException: Range(double, double): require lower<=upper.at org.jfree.data.Range.<init>(Range.java:79)
at org.jfree.data.time.TimeSeriesCollection.getDomainRange(TimeSeriesCol
lection.java:603)
at org.jfree.data.DatasetUtilities.getDomainExtent(DatasetUtilities.java
:162)
at org.jfree.chart.plot.XYPlot.getDataRange(XYPlot.java:2706)
at org.jfree.chart.axis.DateAxis.autoAdjustRange(DateAxis.java:1044)
at org.jfree.chart.axis.DateAxis.configure(DateAxis.java:588)
at org.jfree.chart.plot.XYPlot.configureDomainAxes(XYPlot.java:644)
at org.jfree.chart.plot.XYPlot.datasetChanged(XYPlot.java:2730)
at org.jfree.data.AbstractDataset.notifyListeners(AbstractDataset.java:1
44)
at org.jfree.data.AbstractDataset.fireDatasetChanged(AbstractDataset.jav
a:129)
at org.jfree.data.AbstractSeriesDataset.seriesChanged(AbstractSeriesData
set.java:86)
at org.jfree.data.Series.notifyListeners(Series.java:291)
at org.jfree.data.Series.fireSeriesChanged(Series.java:277)
at org.jfree.data.time.TimeSeries.add(TimeSeries.java:451)
at org.jfree.data.time.TimeSeries.add(TimeSeries.java:473)
at org.jfree.chart.demo.Update.run(DynamicChart1.java:542)

解决方案 »

  1.   

    堂堂CSDN竟然没人, 呵呵……
      

  2.   

    无效参数的问题,应该是Range(double, double)这个方法的第一个参数和第二个参数的大小问题,可能range方法要求第一个参数小于等于第二个,而现在出现了第一个参数大于第二个,我建议在range方法的开头打印这两个参数,以便进一步的调试
      

  3.   

    我在Range内部Throw Exception之前System.out.println(upper+","+lower);
    得到lower:1.092798233408E12, upper:1.09279822686E12
    也就是说,此时确实是lower > upper。
      

  4.   

    如果是这样,就不是range的问题,而是要找到为什么会出现传入range参数的时候,发生前者大于后者的情况,这个和你提供的线程代码关系不大,检查一下什么时候在什么地方调用range方法,再进行进一步调试
      

  5.   

    at org.jfree.chart.demo.Update.run(DynamicChart1.java:542)
    就是从这句开始的,这就是DynamicChart1.java:542
    series.add(millisecond, _dchart._lastValue[i]); //此句偶尔抛出异常
    我在将millisecond传入前将他print出来,并没发现问题,
    后面的时间肯定比前面的大
    接下去触发的一系列Exception都是他lib内部的,我没有直接调用,
    现在我尝试调用Range发生Exception时在Range外将参数打印出来
      

  6.   

    遂将src代码修改如下,并导入原包中
    try
                        {
                            temp = new Range(getX(start), getX(end));
                        }
                        catch(RuntimeException e)
                        {
                            //my code-----------
                            System.out.println(getX(start));
                            System.out.println(getX(end));
                            throw e;
                            //------------------
                        }
    运行半天,得到惊人结果
    Starting ...
    Restarting ...
    lower:1.092812159622E12, upper:1.072800023908E12
    1092812159622 <b>这边明明是很正常的</b>
    1092813083908 <b>怎么打印的数据跟上面不一样?</b>
    java.lang.IllegalArgumentException: Range(double, double): require lower<=upper.        at org.jfree.data.Range.<init>(Range.java:81)
            at org.jfree.data.time.TimeSeriesCollection.getDomainRange(TimeSeriesCol
    lection.java:609)
            at org.jfree.data.DatasetUtilities.getDomainExtent(DatasetUtilities.java
    :162)
            at org.jfree.chart.plot.XYPlot.getDataRange(XYPlot.java:2706)
            at org.jfree.chart.axis.DateAxis.autoAdjustRange(DateAxis.java:1044)
            at org.jfree.chart.axis.DateAxis.configure(DateAxis.java:588)
            at org.jfree.chart.plot.XYPlot.configureDomainAxes(XYPlot.java:644)
            at org.jfree.chart.plot.XYPlot.datasetChanged(XYPlot.java:2730)
            at org.jfree.data.AbstractDataset.notifyListeners(AbstractDataset.java:1
    44)
            at org.jfree.data.AbstractDataset.fireDatasetChanged(AbstractDataset.jav
    a:129)
            at org.jfree.data.AbstractSeriesDataset.seriesChanged(AbstractSeriesData
    set.java:86)
            at org.jfree.data.Series.notifyListeners(Series.java:291)
            at org.jfree.data.Series.fireSeriesChanged(Series.java:277)
            at org.jfree.data.time.TimeSeries.add(TimeSeries.java:451)
            at org.jfree.data.time.TimeSeries.add(TimeSeries.java:473)
            at org.jfree.chart.demo.Update.run(DynamicChart1.java:544)
    Press any key to continue...
    真是恐怖事件!
      

  7.   

    为了查明真相,将TimeSeriesCollection的source code修改如下
    long l1 = getX(start);
    long l2 = getX(end);
    try
    {
        temp = new Range(l1, l2);//getX(start), getX(end));
    }
    catch(RuntimeException e)
    {
        //my code-----------
        try
        {
            java.io.FileWriter filewriter = new java.io.FileWriter("d:\\error.txt");
            java.io.PrintWriter out = new java.io.PrintWriter(filewriter);
                                                        
            out.println("count:"+count);
            out.println("start=" + start);
            out.println("end=" + end);
            out.println("Series:" + series.getItemCount() );
                              
            out.println(l1);//getX(start));
            out.println(l2);//getX(end));
                                
            int num = series.getItemCount();
            for(int i = 0; i < num; i ++)
            {
                TimeSeriesDataItem item = series.getDataItem(i);
                RegularTimePeriod  period = item.getPeriod() ;
                java.util.Date date = period.getStart();
                out.println("item=" +i + ", dateStart:" + date.getTime());
                                    
                date = period.getEnd();
                out.println("item=" +i + ", dateEnd:" + date.getTime());
             }
             out.flush();
             out.close();
        }
        catch(IOException ex)
        {
             ex.printStackTrace();
         }
    throw e;
    //------------------
    得到error.txt的内容:
    count:957
    start=Thu Aug 19 13:50:58 GMT+08:00 2004
    end=Thu Aug 19 14:03:21 GMT+08:00 2004
    Series:957
    1092895438756
    1092895401231
    item=0, dateStart:1092894658756
    item=0, dateEnd:1092894658756
    item=1, dateStart:1092894659272
    item=1, dateEnd:1092894659272
    不可思议啊
    item0 其实是Thu Aug 19 14:03:58 GMT+08:00 2004
    也就是说
    13:50:58  变成了   14:03:58
    这是怎么造成的??????????????
      

  8.   

    getX(???)是做什么用的,里面传入的start和end是什么参数,什么性质,getX返回long型的时间?还是什么
      

  9.   

    series 是个 TimeSeriesfinal RegularTimePeriod start = series.getTimePeriod(0);
    final RegularTimePeriod end = series.getTimePeriod(count - 1);以下是getX()的sourceprivate long getX(final RegularTimePeriod period) {        long result = 0L;
            if (this.xPosition == TimePeriodAnchor.START) {
                result = period.getFirstMillisecond(this.workingCalendar);
            }
            else if (this.xPosition == TimePeriodAnchor.MIDDLE) {
                result = period.getMiddleMillisecond(this.workingCalendar);
            }
            else if (this.xPosition == TimePeriodAnchor.END) {
                result = period.getLastMillisecond(this.workingCalendar); 
            }
            return result;    }
    我可以保证xPosition一直是START
    假设我的保证不成立
    看getFirstMillisecond和getLastMillisecond的source
    需要说明的是想在period是个Millisecond,所以source也是Millisecond的
    public long getFirstMillisecond(final Calendar calendar) {        return this.second.getFirstMillisecond(calendar) + this.millisecond;    }
    ///////////////////////////////
    public long getLastMillisecond(final Calendar calendar) {        return this.second.getFirstMillisecond(calendar) + this.millisecond;    }
      

  10.   

    还是不怎么懂getX到底返回什么,start和end的具体含义,按照我的理解和你的打印信息,如果
    start=Thu Aug 19 13:50:58 GMT+08:00 2004
    end=Thu Aug 19 14:03:21 GMT+08:00 2004
    而后面的
    out.println(l1);//getX(start));
    out.println(l2);//getX(end));
    的结果是
    1092895438756   ---结果1
    1092895401231   ---结果2
    如果我理解的这两个打印结果(结果1、结果2)是代表long型的时间,那么可以看出
    getX(start)此时已经是大于getX(end),也就是说开始时间晚于结束时间,这样的话
    问题就是出在getX这个方法里了,getX里面因为还是嵌套了其它方法,我不是很明了具体的
    含义,但是代码应该不会有问题,剩下的就是检查参数
    final RegularTimePeriod start = series.getTimePeriod(0);
    final RegularTimePeriod end = series.getTimePeriod(count - 1);这个start传入getX如果返回的结果就是比end传入getX来的大,那么究竟结果是不是就应该大,还是其它怎么样怎么样的,我不知道了只能你自己检查了
      

  11.   

    不只是getX()出现问题
    item=0, dateStart:1092894658756
    item=0, dateEnd:1092894658756
    没有经过getX(),而是通过series.getDataItem().getPeriod().getStart()得到的,却也错得一模一样!!!
    但是发现RegularTimePeriod里的getStart():
        public Date getStart() {
            return new Date(getFirstMillisecond());
        }
    也调用了getFirstMillisecond();
    显然,问题就出现在getFirstMillisecond()里,有待进一步分析