异常提示如下:
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)
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)
解决方案 »
- 对bo和po的一些问题
- struts2 中List问题
- 编译tomcat4.1下servlet的问题
- JBuilderX+Weblogic7.0如何开发JSP2.0的应用
- 初学一个简单的EJB,但是编译不过去,请高手指点!!!
- 请问visualage for java现在最新版本是多少?
- 请问什么是mailing list?用来做什么的?
- 请教一个用com.microsoft.jdbc.sqlserver.SQLServerDriver的配置问题
- 打开MyEclipse提示构建工作空间出错,项目运行不了,如何解决?
- DecimalFormat格式化double类型的数字有误差
- 拜托!请问全面学习J2EE一共要装哪些软件?谢谢!
- java缓存技术讨论
得到lower:1.092798233408E12, upper:1.09279822686E12
也就是说,此时确实是lower > upper。
就是从这句开始的,这就是DynamicChart1.java:542
series.add(millisecond, _dchart._lastValue[i]); //此句偶尔抛出异常
我在将millisecond传入前将他print出来,并没发现问题,
后面的时间肯定比前面的大
接下去触发的一系列Exception都是他lib内部的,我没有直接调用,
现在我尝试调用Range发生Exception时在Range外将参数打印出来
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...
真是恐怖事件!
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
这是怎么造成的??????????????
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; }
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来的大,那么究竟结果是不是就应该大,还是其它怎么样怎么样的,我不知道了只能你自己检查了
item=0, dateStart:1092894658756
item=0, dateEnd:1092894658756
没有经过getX(),而是通过series.getDataItem().getPeriod().getStart()得到的,却也错得一模一样!!!
但是发现RegularTimePeriod里的getStart():
public Date getStart() {
return new Date(getFirstMillisecond());
}
也调用了getFirstMillisecond();
显然,问题就出现在getFirstMillisecond()里,有待进一步分析