程序出错,找不出原因,求大神
这是错误的原因,果断看不懂
Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException: 0
at MyTimeCalculator.actionPerformed(TimeCalculator.java:190)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6134)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5899)
at java.awt.Container.processEvent(Container.java:2023)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Container.dispatchEventImpl(Container.java:2081)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
at java.awt.Container.dispatchEventImpl(Container.java:2067)
at java.awt.Window.dispatchEventImpl(Window.java:2458)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
[最优解释]
没得说,java.lang.ArrayIndexOutOfBoundsException 数组越界。按楼上的去找TimeCalculator类里的第190行。
[其他解释]
MyTimeCalculator.actionPerformed(TimeCalculator.java:190);
//在你的错误提示控制台双击上面的这行,就可以看到报错的位置,感觉是你的循环写错了。一般情况下用for循环都是
String[] aa = new String[4];
//这时候aa数组的总长度是4,但是数组都是从下标0开始的,所以循环应该这样写
for (int i = 0; i < aa.length - 1; i ++){
aa[i] = "当前是第" + (i + 1) + "个元素!";
}
}
try {
endDate = sdf.parse(date2);
} catch (ParseException e1) {
JOptionPane.showMessageDialog(null, "结束时间有误\r\n请重新输入");
}
c = new GregorianCalendar();
c.setTime(startDate);
startTime = c.getTimeInMillis() / 3600000;
c.setTime(endDate);
endTime = c.getTimeInMillis() / 3600000;
ArrayList<Node> list = new ArrayList<Node>();
int count=this.tableModel.getRowCount()-1;
for(int i=0;i<count;i++){
Object o1=this.tableModel.getValueAt(i, 0);
Object o2=this.tableModel.getValueAt(i, 1);
String str1=String.valueOf(o1);
String str2=String.valueOf(o2);
try {
Date d=sdf.parse(str1);
Float p=Float.parseFloat(str2);
Node n=new Node(d,p);
list.add(n);
} catch (ParseException e1) {
e1.printStackTrace();
}
}
time = new long[list.size()];//实例化时间数组time[],长度为list的长度
salary = new float[list.size()];//实例化薪水数组salary[],长度为list的长度
for (int x = 0; x <list.size(); x++) {//遍历链表
Calendar c = Calendar.getInstance();//每次遍历实例化一个日历类对象
Node n = (Node)(list.get(x));//取得链表中的每个Node对象
Date date = n.getDate();//取得Node对象的Date属性
c.setTime(date);//将日历翻到date时
price = n.getPrice(); // 获得该时间段的单价/分钟
long l = c.getTimeInMillis() / 3600000; // l存储该段的时间点(到分钟)
time[index] = l;//index为数组下标,这里存储时间点
salary[index] = price;//这里存储单价
index++;//每次遍历完,下标index加1
}
if (list.size() == 1) {// ******当分一段(6点后时间都一样)
result = (endTime - startTime) * salary[0];// 此时从18点到凌晨4点价格都是一样的,时间为itInstance.endTime-itInstance.startTime,单价:salary[0]
} else if (list.size() == 2) {// 当分两段(6点一个,之后还有一个断点)
if (startTime < time[1] && endTime > time[1]) {// *******分两段,18是一个断点,之后还有一个断点x,如果itInstance.endTime和itInstance.startTime分别处于x两侧,则:
result = (time[1] - startTime) * salary[0]
+ (endTime - time[1]) * salary[1];
} else if (startTime < time[1]
&& endTime < time[1]) {// 如果itInstance.endTime和itInstance.startTime都处于x左侧
result = (endTime - startTime)
* salary[0];
} else {// 如果itInstance.endTime和itInstance.startTime都处于x右侧
result = (endTime - startTime)
* salary[1];
}
}// 1段结束
else {
//****** 当分n段(n>2)时,算法还没有完善
for (int i = 0; i < time.length; i++) {// 遍历时间数组,确定index1位置
if (time[i] > startTime) {// 遇到d数组中第一个比itInstance.startTime大的数,记录这个断点到index1
index1 = i;
break;
} else {
index1 = time.length - 1;// 如果d数组中没有比itInstance.startTime大的数,记录数组最后一个断点到index1
}
}
for (int j = 0; j < time.length; j++) {// 遍历时间数组,确定index2位置
if (time[j] > endTime) {// 遇到第一个比itInstance.endTime大的数,记录断点j-1到index2
index2 = j - 1;
break;
} else if (endTime > time[time.length - 1]) {// 如果没有比itInstance.endTime大的数,那么数组的最后一个断点记录到index2
index2 = time.length - 1;
}
}
for (int j = index1; j < index2; j++) {// 记算index1——index2之间的工资
result += (time[j + 1] - time[j]) * salary[j];
}
result += (time[index1] - startTime)// 上面的工资加上开头段和结尾段的工资
* salary[index1 - 1]
+ (endTime - time[index2])
* salary[index2];
}
JOptionPane.showMessageDialog(null, result);
[其他解释]
该回复于2012-11-16 13:50:43被管理员删除
[其他解释]
数组就2个, time 和 salary, 看看list.size()是多少,后面用的时候,估计下标超过这个数了。
[其他解释]
这样直接看不好断定错误,给你标出可能出错的地方吧。
time[index] = l;//index为数组下标,这里存储时间点
salary[index] = price;//这里存储单价
index++;//每次遍历完,下标index加1
//首先这个Index是哪里定义的?为什么不直接用X?
//第二个可能错误的地方
} else if (startTime < time[1]
&& endTime < time[1]) {// 如果itInstance.endTime和itInstance.startTime都处于x左侧
result = (endTime - startTime)
* salary[0];
} else {// 如果itInstance.endTime和itInstance.startTime都处于x右侧
result = (endTime - startTime)
* salary[1];
}
//像这里你都没有判断如果time为空,就是里面没有值的情况下呢?肯定越界了,下面也是,会不会是因为数组没值,那么下标0也会出错的!