【问题标题】:java.lang.IndexOutOfBoundsException: Index: 38, Size: 38java.lang.IndexOutOfBoundsException:索引:38,大小:38
【发布时间】:2015-07-09 06:44:19
【问题描述】:

我目前正在做一个项目,我收到了这个错误。我不知道为什么它停在索引 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 条记录。有什么帮助吗?

【问题讨论】:

  • 调试您的代码,确保您的 valueList 的大小大于 38。
  • 你在哪里初始化了计数?
  • 你确定这是 Java 吗?
  • @ramp,我已经在顶部初始化了它。我将编辑我的代码。

标签: java mysql database jsp servlets


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您不知何故错过了 JSP 是 HTML/CSS/JS 代码生成器这一事实,并且您希望 JSP EL 表达式与嵌入在 JSP 文件中的 JavaScript 代码“同步”运行。这是不真实的。 JSP/EL 在网络服务器中运行,产生 HTML/CSS/JS 输出,基本上作为一个大的String 从网络服务器发送到网络浏览器,后者又运行 JSP/EL 产生的 HTML/CSS/JS 输出。

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

    基本上,您的代码 sn-p 中的 --count 仅在 JavaScript 中有效,在 JSP 中无效,因为您在生成 HTML 输出期间基本上将 ${count} 作为 JavaScript 变量 var count 打印。但是 JavaScript 中var count 的值不会影响${count} 的值,它在${valueList.get(count)} 中被进一步使用。 ${count} 那里还有 38 岁,还没有变成 37 岁左右。


    这就是问题所在。现在我们可以推进解决方案。我不会发布专门修复您尝试的解决方案的答案,原因很简单,这是从高层看到您尝试解决的潜在问题的错误解决方案:将 Java 模型对象转换为 JavaScript 对象。

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

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

    public class Point {
        private int x;
        private int y;
        // Add/generate constructor+getter+setter+equals+hashcode.
    }
    

    然后替换您的XValueListYValueList 如下:

    List<Point> points = new ArrayList<>();
    points.add(new Point(1, 2));
    points.add(new Point(3, 4));
    points.add(new Point(5, 6));
    // ...
    

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

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

    现在让 JSP 把它当作一个 JS 变量来打印,正确的方式:

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-12
      • 1970-01-01
      • 2013-12-21
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多