I am getting a NullPointerException
when I amtrying to get an Object
through ObjectInputStream
via a Socket
. I am using a server to send information to the client (android phone) through a TransferObject
. I know the server is sending the Object
because when it sends an error it is read fine and throws no exceptions. All sent classes are serializable, contain a serialVersionID, and are contained in both projects.
code:
TransferObject data = null;
try {
Socket s = new Socket();
s.connect(new InetSocketAddress(HOST, PORT), 10000);
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
send.setUser(useremail);
send.setPassword(password);
oos.writeObject(send);
oos.flush();
Object inputObject = ois.readObject(); //Error happens here.
data = (TransferObject) inputObject;
s.close();
return data;
}
and here is TransferObject
:
public class TransferObject implements Serializable {
private static final long serialVersionUID = *******************L; //blanked this out
public String command;
public String args;
public Object[] objects;
private String password;
private String user;
public TransferObject() {
}
public TransferObject(String command, String args, Object[] objects) {
this.objects = objects;
this.args = args;
this.command = command;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUser() {
return this.user;
}
public void setUser(String user) {
this.user = user;
}
}
And lastly, the dreaded log:
07-20 14:38:16.044: E/AndroidRuntime(2451): FATAL EXCEPTION: AsyncTask #1
07-20 14:38:16.044: E/AndroidRuntime(2451): Process: com.********************.**********.timecardmanager, PID: 2451
07-20 14:38:16.044: E/AndroidRuntime(2451): java.lang.RuntimeException: An error occured while executing doInBackground()
07-20 14:38:16.044: E/AndroidRuntime(2451): at android.os.AsyncTask$3.done(AsyncTask.java:304)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
07-20 14:38:16.044: E/AndroidRuntime(2451): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.lang.Thread.run(Thread.java:818)
07-20 14:38:16.044: E/AndroidRuntime(2451): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Class.isProxy()' on a null object reference
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.lang.reflect.Proxy.isProxyClass(Proxy.java:261)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectStreamClass.resolveProperties(ObjectStreamClass.java:1016)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectStreamClass.isEnum(ObjectStreamClass.java:1040)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectStreamClass.checkAndGetTcObjectClass(ObjectStreamClass.java:1341)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1788)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readContent(ObjectInputStream.java:707)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.discardData(ObjectInputStream.java:636)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1348)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1113)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:454)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1345)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readNewArray(ObjectInputStream.java:1488)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:759)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1113)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:454)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1345)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
07-20 14:38:16.044: E/AndroidRuntime(2451): at com.********************.**********.timecardmanager.MainActivity.sendToServer(MainActivity.java:158)
07-20 14:38:16.044: E/AndroidRuntime(2451): at com.********************.**********.timecardmanager.TimecardFragment$GetCardsTask.doInBackground(TimecardFragment.java:81)
07-20 14:38:16.044: E/AndroidRuntime(2451): at com.********************.**********.timecardmanager.TimecardFragment$GetCardsTask.doInBackground(TimecardFragment.java:1)
07-20 14:38:16.044: E/AndroidRuntime(2451): at android.os.AsyncTask$2.call(AsyncTask.java:292)
07-20 14:38:16.044: E/AndroidRuntime(2451): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
07-20 14:38:16.044: E/AndroidRuntime(2451): ... 4 more
Thanks in advance.
edit: server side. run each time a new client connects on a new thread.
try
{
ObjectOutputStream oos = new ObjectOutputStream(soc.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(soc.getInputStream());
TransferObject obj = (TransferObject) ois.readObject();
switch(obj.command)
{
case "REQ":
JavaTimecard[] javaCards = BullhornTools.getJavaCards(obj.getUser(), obj.getPassword());
if(javaCards == null)
{
obj.command = "ERR";
obj.args = BullhornTools.getError();
obj.setUser("");
obj.setPassword("");
oos.writeObject(obj);
oos.flush();
}
else
{
obj.command = "AKK";
obj.args = "";
obj.objects = new Object[javaCards.length];
obj.setUser("");
obj.setPassword("");
for(int i = 0; i < javaCards.length; i++)
{
obj.objects[i] = javaCards[i];
}
oos.writeObject(obj);
oos.flush();
}
break;
case "SAVE":
//TODO: Implement later
break;
}
soc.close();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
I tried to test it by serializing, storing in a file, and reading it back in. That worked fine, therefore I'm going to assume its an android thing. As Selvin said, just used JSON.
As for any possible lack of clearness, I apologize.