程序出错,找不出原因,求大神

ganji1 2012-11-16 08:38:02
这是错误的原因,果断看不懂

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)
...全文
252 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
leandzgc 2012-11-17
  • 打赏
  • 举报
回复
这样直接看不好断定错误,给你标出可能出错的地方吧。

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也会出错的!
ganji1 2012-11-16
  • 打赏
  • 举报
回复
public void actionPerformed(ActionEvent e) { if (e.getSource() == button) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm");// 日期格式化(月-天-小时-分钟,年份默认为当前年份) date1 = t1.getText(); date2 = t2.getText(); try { startDate = sdf.parse(date1); } catch (ParseException e1) { JOptionPane.showMessageDialog(null, "开始时间有误\r\n请重新输入"); } 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);
ganji1 2012-11-16
  • 打赏
  • 举报
回复
代码有点长啊,我贴一部分
ganji1 2012-11-16
  • 打赏
  • 举报
回复
抱歉,刚才上课去了
leandzgc 2012-11-16
  • 打赏
  • 举报
回复

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) + "个元素!";
}
dengsilinming 2012-11-16
  • 打赏
  • 举报
回复
没得说,java.lang.ArrayIndexOutOfBoundsException 数组越界。按楼上的去找TimeCalculator类里的第190行。
  • 打赏
  • 举报
回复
java.lang.ArrayIndexOutOfBoundsException: 0 越界了。 TimeCalculator.java:190,看看190行。 代码发上来
nmyangym 2012-11-16
  • 打赏
  • 举报
回复
数组就2个, time 和 salary, 看看list.size()是多少,后面用的时候,估计下标超过这个数了。

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧