I am running this code on the Tomcat server as a Java application.
if(levelMap.get(bssid_a) == null)
continue;
ArrayList<String> levels_a = new ArrayList<String>();
levels_a = (ArrayList<String>)levelMap.get(bssid_a);
where levelMap is a hashmap defines as:
HashMap<String, ArrayList<String>> levelMap
I am getting this error:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.ArrayList
The same code is working in my Android application, so I am not sure why I am getting this error.
The original function (without type casting, but gives me the same error):
public EDistance[] getLocation(HashMap<String, ArrayList<String>> levelMap) {
HashMap<String, CrossProduct> crossProductList_local = new HashMap<String, CrossProduct>();
LinkedHashSet<String> localList = (LinkedHashSet<String>) globalList.clone();
Iterator<String> cpItera = localList.iterator();
long time1 = System.currentTimeMillis();
// Iterator<String> levelIter = levelMap.keySet().iterator();
// try {
while (cpItera.hasNext()) {
String ssids[] = cpItera.next().split(",");
String bssid_a = ssids[0];
if(levelMap.get(bssid_a) == null)
continue;
//ArrayList<String> levels_a = new ArrayList<String>();
ArrayList<String> levels_a = levelMap.get(bssid_a);
double meanA = mean(levels_a, sampleSize, defaultLevel);
// Iterator<String> cpIterb = localList.iterator();
//
// while(cpIterb.hasNext())
// {
String bssid_b = ssids[1];
// if(bssid_a.equals(bssid_b))
// continue;
if(levelMap.get(bssid_b) == null)
continue;
//ArrayList<String> levels_b = new ArrayList<String>();
ArrayList<String> levels_b = levelMap.get(bssid_b);
double meanB = mean(levels_b, sampleSize, defaultLevel);
............
Here is the stacktrace:
SEVERE: Failed to invoke method distance in class com.fingerprint.core.Calculate: [Ljava.lang.Object; cannot be cast to java.util.ArrayList
org.apache.xmlrpc.common.XmlRpcInvocationException: Failed to invoke method distance in class com.fingerprint.core.Calculate: [Ljava.lang.Object; cannot be cast to java.util.ArrayList
at org.apache.xmlrpc.server.ReflectiveXmlRpcHandler.invoke(ReflectiveXmlRpcHandler.java:129)
at org.apache.xmlrpc.server.ReflectiveXmlRpcHandler.execute(ReflectiveXmlRpcHandler.java:106)
at org.apache.xmlrpc.server.XmlRpcServerWorker.execute(XmlRpcServerWorker.java:46)
at org.apache.xmlrpc.server.XmlRpcServer.execute(XmlRpcServer.java:86)
at org.apache.xmlrpc.server.XmlRpcStreamServer.execute(XmlRpcStreamServer.java:200)
at org.apache.xmlrpc.webserver.XmlRpcServletServer.execute(XmlRpcServletServer.java:112)
at org.apache.xmlrpc.webserver.XmlRpcServlet.doPost(XmlRpcServlet.java:196)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.ArrayList
at com.fingerprint.location.HyperbolicEuclideanDistance.getLocation(HyperbolicEuclideanDistance.java:235)
at com.fingerprint.core.Calculate.distance(Calculate.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.xmlrpc.server.ReflectiveXmlRpcHandler.invoke(ReflectiveXmlRpcHandler.java:115)
... 24 more
Caused by:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.ArrayList
at com.fingerprint.location.HyperbolicEuclideanDistance.getLocation(HyperbolicEuclideanDistance.java:235)
at com.fingerprint.core.Calculate.distance(Calculate.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.xmlrpc.server.ReflectiveXmlRpcHandler.invoke(ReflectiveXmlRpcHandler.java:115)
at org.apache.xmlrpc.server.ReflectiveXmlRpcHandler.execute(ReflectiveXmlRpcHandler.java:106)
at org.apache.xmlrpc.server.XmlRpcServerWorker.execute(XmlRpcServerWorker.java:46)
at org.apache.xmlrpc.server.XmlRpcServer.execute(XmlRpcServer.java:86)
at org.apache.xmlrpc.server.XmlRpcStreamServer.execute(XmlRpcStreamServer.java:200)
at org.apache.xmlrpc.webserver.XmlRpcServletServer.execute(XmlRpcServletServer.java:112)
at org.apache.xmlrpc.webserver.XmlRpcServlet.doPost(XmlRpcServlet.java:196)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
The code calling the XMlRPC method:
public String getLocationXMLRPC(HashMap<String, ArrayList<String>> levelMap, String mapFile) {
try {
XMLRPCClient client = new XMLRPCClient("http://172.28.184.222:8080/LocationService/xmlrpc");
Object[] params = new Object[]{levelMap, mapFile};
//EDistance retura[] = (EDistance[]) client.callEx("Calculate.distance", params);
String result = (String) client.callEx("Calculate.distance", params);
return result;
} catch (XMLRPCException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
The XMLRPC method that calls the erroneous function:
public String distance(HashMap<String, ArrayList<String>> levelMap, String mapFile)
{
if(dist == null){
dist = new HyperbolicEuclideanDistance(mapFile, 3, -130,
false, "fake.txt");
System.out.println("New Class created!");
}
EDistance[] result = dist.getLocation(levelMap);
StringBuilder build = new StringBuilder();
for (int j = 0; j < result.length; j++) {
if (result[j] != null)
build.append(j + ") " + result[j] + "\n");
}
return build.toString();
}
The code that calls the server:
public String getLocationXMLRPC(HashMap<String, ArrayList<String>> levelMap, String mapFile) {
try {
XMLRPCClient client = new XMLRPCClient("http://172.28.184.222:8080/LocationService/xmlrpc");
String result = (String) client.call("Calculate.distance", levelMap, mapFile);
return result;
} catch (XMLRPCException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
HashMap<String, Object[]>not aHashMap<String, ArrayList<String>>. The JVM is not wrong in this situation, but somehow your understanding of your code must be. The reason is buried in code not shown.levelMap. That is the cause for theClassCastException. Besides it is not necessary to initializelevels_awith an emptyArrayList<String>, if you overwrite it at once. And: You don't have to cast, if levelMap is really declared as you already showed.distancemust be a method of some classCalculate- if that's not an alias - and is called inside the XMLRPC server. The invalid parameter is set up at the client side.