У меня есть JSP-программа, в которой я пытаюсь динамически загружать флажки, используя столбцы из xls, для которых я использую собственную библиотеку с именем JEP , чтобы использовать Python для получения данных. Я знаю, Я могу использовать что-то вроде ApachePOI, чтобы сделать то же самое, но позже мне нужно будет использовать JEP в том же веб-приложении.
JSP для флажков:
<%@ page import ="Excel.getCSV" %>
<%@page import = "java.util.ArrayList " %>
<% ArrayList<String> columns = new ArrayList<String>();
columns= getCSV.columnGetter();
//String hobbies[];
for(int i=0;i<columns.size();i++){ String str= columns.get(i);
%> <li class="mdl-list__item">
<input type="checkbox" name="hobbies[]" id="hobby1" value= <%= str %> />
<%= str %> <!-- all of this works -->
</li>
Для обработки данных формы
<%@ page import = "java.io.*,java.util.*" %>
<%@ page import ="org.apache.commons.lang3.ArrayUtils" %>
<%
String[] form = {"asda","asd"};
//form = request.getParameterValues("hobbies[]"); I have tried using
//ArrayUtils.isNotEmpty instead of using the enum
System.out.println("I am here"); //This works
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
System.out.println("I actually reached here");// Crashes before printing
this.
%>
<jsp:forward page = "Page3.jsp" /><%
<% }
%>
Код получателя столбца:
public static ArrayList<String> columnGetter() throws JepException {
try(Jep jep = new Jep()) {
jep.set("pathToPython", path);
jep.eval("from foo import getColumn");
jep.eval("x= getColumn(pathToPython,1)");
names=(ArrayList<String>) jep.getValue("x");
jep.close();
}
return names;}
JVM падает со следующей ошибкой:
#The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
Итак, я удалил собственный код (код JEP), и программа работает.
Проблема
Избегать нативного кода не является решением. Итак, я увидел журнал ошибок, в соответствии с которым существует «ArrayIndexOutOfBoundsException»
Internal exceptions (10 events):
Event: 16.868 Thread 0x000000001ec47000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException': -1> (0x00000000dacc0b00) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u181\11358\hotspot\src\share\vm\interpreter\interpreterRuntime.cpp, line 366]
Event: 17.217 Thread 0x000000001b19d000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException': -1> (0x00000000db032ec8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u181\11358\hotspot\src\share\vm\interpreter\interpreterRuntime.cpp, line 366]
Event: 17.217 Thread 0x000000001b19d000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException': -1> (0x00000000db033100) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u181\11358\hotspot\src\share\vm\interpreter\interpreterRuntime.cpp, line 366]
Event: 17.232 Thread 0x000000001b19d000 Implicit null exception at 0x000000000534ebb1 to 0x00000000053512e1
Event: 17.271 Thread 0x000000001b19d000 Implicit null exception at 0x0000000004ec1ead to 0x0000000004ec4159
Event: 17.272 Thread 0x000000001b19d000 Implicit null exception at 0x0000000004cae411 to 0x0000000004cae849
Event: 17.611 Thread 0x000000001b19d000 Exception <a 'java/lang/ArrayIndexOutOfBoundsException': 10604> (0x00000000d6608708) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u181\11358\hotspot\src\share\vm\interpreter\interpreterRuntime.cpp, line 366]
Event: 87.576 Thread 0x000000001be5e800 Exception <a 'java/lang/ArrayIndexOutOfBoundsException': -1> (0x00000000ddeb7a88) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u181\11358\hotspot\src\share\vm\interpreter\interpreterRuntime.cpp, line 366]
Event: 87.576 Thread 0x000000001be5e800 Exception <a 'java/lang/ArrayIndexOutOfBoundsException': -1> (0x00000000ddeb7cc0) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u181\11358\hotspot\src\share\vm\interpreter\interpreterRuntime.cpp, line 366]
Event: 87.626 Thread 0x000000001be5e800 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x00000000ddf7cb58) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u181\11358\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Я попытался выяснить, что может быть причиной этого, и подошел пустой. Код JEP был использован для создания флажков, который работает нормально. Я пытался использовать sys.out для отладки кода. Ошибка происходит, когда я нажимаю кнопку, что приводит к заполнению перечисления, и в этот момент, когда проверяется условие while, JVM падает с ArrayIndex за пределами.
Я попытался использовать строковый массив для значений формы, а затем методы .length ArrayUtils.isNotEmpty, ни один из которых не должен вызывать эту ошибку.
Вопрос
Почему JVM дает сбой там, где происходит сбой? Если это проблема с JEP, не должен ли он произойти сбой до создания флажка?