ArrayIndexOutOfBoundsException:网络服务器中的 1
ArrayIndexOutOfBoundsException: 1 in web server
我使用 tomcat 网络容器和 jersey 库创建了一个简单的 RESTful 网络服务。
我只重写了 post 方法,其余的都使用默认设置。
从服务器计算机发送来自 curl
的 POST
查询时,我得到了预期的响应。从其他机器上,我也得到了 GET
查询的预期响应,但是对于 POST
我得到了 java.lang.
ArrayIndexOutOfBoundsException: 1
异常错误。 post 方法是这样的:
@POST
@Produces(MediaType.TEXT_PLAIN)
public String post(String str) {
String[] parts = str.split("&");
String[] param1 = parts[0].split("=");//value1=param1[1] (one/two): query type
String[] param2 = parts[1].split("=");//value2=param2[1]
String[] param3 = parts[2].split("=");//value3=param3[1]
String[] param4 = parts[3].split("=");//value4=param4[1]
if(param1[1].equals("one")){
return hashGenerator(param2[1],param3[1]);
}else if(param1[1].equals("two")){
return saveInput(param2[1],param3[1],param4[1]);
}
return "Unexpected Query";
}
服务器的响应是:
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: java.lang.ArrayIndexOutOfBoundsException: 1
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:421)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:222)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
root cause
java.lang.ArrayIndexOutOfBoundsException: 1
com.va.jersey.helloworld.Hello.post(Hello.java:39)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.invoke(ResourceMethodInvocationHandlerFactory.java:81)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.run(AbstractJavaResourceMethodDispatcher.java:164)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:181)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:203)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:101)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
org.glassfish.jersey.server.ServerRuntime.run(ServerRuntime.java:305)
org.glassfish.jersey.internal.Errors.call(Errors.java:271)
org.glassfish.jersey.internal.Errors.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:288)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1110)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:401)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:222)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
能否请您提出可能的错误....
您正在请求可能不存在的数组元素,因此当您尝试使用这些不存在的元素时,将输入字符串拆分为一个字符而不检查数组的长度总是有抛出 ArrayIndexOutOfBoundsException
的风险数组元素稍后(输入字符串 foo&bar
即可)。
此外,你永远不应该自己解析表单数据/查询字符串,有太多的边缘情况。使用一个库,或者最好还是使用你的框架(Jersey)——它作为 JAX-RS 的一部分,有 support for Form Params. See an example here.
或者您可以增加 RESTful 并使用 PathParam 在请求中显式获取参数,如果可以的话。
我使用 tomcat 网络容器和 jersey 库创建了一个简单的 RESTful 网络服务。
我只重写了 post 方法,其余的都使用默认设置。
从服务器计算机发送来自 curl
的 POST
查询时,我得到了预期的响应。从其他机器上,我也得到了 GET
查询的预期响应,但是对于 POST
我得到了 java.lang.
ArrayIndexOutOfBoundsException: 1
异常错误。 post 方法是这样的:
@POST
@Produces(MediaType.TEXT_PLAIN)
public String post(String str) {
String[] parts = str.split("&");
String[] param1 = parts[0].split("=");//value1=param1[1] (one/two): query type
String[] param2 = parts[1].split("=");//value2=param2[1]
String[] param3 = parts[2].split("=");//value3=param3[1]
String[] param4 = parts[3].split("=");//value4=param4[1]
if(param1[1].equals("one")){
return hashGenerator(param2[1],param3[1]);
}else if(param1[1].equals("two")){
return saveInput(param2[1],param3[1],param4[1]);
}
return "Unexpected Query";
}
服务器的响应是:
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: java.lang.ArrayIndexOutOfBoundsException: 1
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:421)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:222)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
root cause
java.lang.ArrayIndexOutOfBoundsException: 1
com.va.jersey.helloworld.Hello.post(Hello.java:39)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.invoke(ResourceMethodInvocationHandlerFactory.java:81)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.run(AbstractJavaResourceMethodDispatcher.java:164)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:181)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:203)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:101)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
org.glassfish.jersey.server.ServerRuntime.run(ServerRuntime.java:305)
org.glassfish.jersey.internal.Errors.call(Errors.java:271)
org.glassfish.jersey.internal.Errors.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:288)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1110)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:401)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:222)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
能否请您提出可能的错误....
您正在请求可能不存在的数组元素,因此当您尝试使用这些不存在的元素时,将输入字符串拆分为一个字符而不检查数组的长度总是有抛出 ArrayIndexOutOfBoundsException
的风险数组元素稍后(输入字符串 foo&bar
即可)。
此外,你永远不应该自己解析表单数据/查询字符串,有太多的边缘情况。使用一个库,或者最好还是使用你的框架(Jersey)——它作为 JAX-RS 的一部分,有 support for Form Params. See an example here.
或者您可以增加 RESTful 并使用 PathParam 在请求中显式获取参数,如果可以的话。