java.lang.IndexOutOfBoundsException:索引:38,大小:38

时间:2015-07-09 06:44:19

标签: java mysql database jsp servlets

我目前正在开展一个项目,但我收到了这个错误。我不知道为什么它会在索引38处停止。错误是

org.apache.jasper.JasperException: javax.el.ELException: java.lang.IndexOutOfBoundsException: Index: 38, Size: 38
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:413)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:253)
javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

我以前用来显示的代码是一个while循环

var count = ${count};
 while (--count) {
      var val = ${valueList.get(count)}; //get value from her code
      var xValue = ${XValueList.get(count)};
      var yValue = ${YValueList.get(count)};
      //max = Math.max(max, val);
      //
      min = 0;
      var point = {
        x: xValue,
        y: yValue,
        value: val
      };
      points.push(point);
    }

   // var data = { max: max, min:min, data: points };
   var data = {data: points };
    return data;
  };

我的数据库中有41条记录。有什么帮助吗?

2 个答案:

答案 0 :(得分:3)

数组从0开始计数,但它们的大小以字段数给出。大小为38的数组实际上有0到37字段。访问字段38会抛出java.lang.IndexOutOfBoundsException。

答案 1 :(得分:3)

你错过了一个事实,即JSP是一个HTML / CSS / JS代码生成器,你期望JSP EL表达式在同步中运行"使用嵌入在JSP文件中的JavaScript代码。这是不真实的。 JSP / EL在webserver中运行,生成HTML / CSS / JS输出,基本上是一个大的String,从webserver发送到webbrowser,后者又运行JSP / EL生成的HTML / CSS / JS输出。 / p>

实现错误的一种简单方法是在webbrowser中执行右键单击和查看源(在包含标记和EL表​​达式的JSP页面上,不会像这样抛出服务器端异常,当然)。您会注意到它实际上并不包含任何单行的JSP / EL代码。

基本上,代码段中的--count仅在JavaScript中有效,而不在JSP中,因为在生成HTML输出期间,您基本上将${count}打印为JavaScript变量var count。但JavaScript中var count的值绝不会影响${count}${valueList.get(count)}进一步使用的值${count}public class Point { private int x; private int y; // Add/generate constructor+getter+setter+equals+hashcode. } 在那里仍然是38,并且还没有变成37左右。

这就是问题所在。现在我们可以进入解决方案。我没有发布答案来专门修复您尝试的解决方案,原因很简单,这是因为您从高级别看到了您尝试解决的基础问题的错误解决方案:将Java模型对象转换为JavaScript对象。 / p>

正确的解决方案是将Java模型对象转换为Java端的JSON格式的字符串,然后让JSP打印它就好像它是一个JavaScript变量。您的Java模型对象还有另一个问题:您似乎已将两个单独列表中的X和Y值分离,而不是使用具有X和Y值的实体的单个列表。

首先创建一个decent模型对象:

XValueList

然后将YValueListList<Point> points = new ArrayList<>(); points.add(new Point(1, 2)); points.add(new Point(3, 4)); points.add(new Point(5, 6)); // ... 替换为如下:

String pointsAsJson = new Gson().toJson(points);

然后使用Java JSON APIs之一将其转换为JSON字符串。我将在下面的示例中选择Gson

var data = {data: ${pointsAsJson} };

现在让JSP打印它,好像它是一个JS变量,正确的方式:

gruntfile.js

这里不需要笨拙的循环按摩数据。