【发布时间】:2015-07-20 19:57:03
【问题描述】:
当我试图通过ObjectInputStream 通过Socket 获得Object 时,我获得了NullPointerException。我正在使用服务器通过TransferObject 向客户端(Android 手机)发送信息。我知道服务器正在发送Object,因为当它发送错误时,它会被很好地读取并且不会引发异常。所有发送的类都是可序列化的,包含一个 serialVersionID,并且包含在两个项目中。
代码:
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;
}
这里是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;
}
}
最后,可怕的日志:
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
提前致谢。
编辑:服务器端。每次新客户端连接到新线程时运行。
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();
}
【问题讨论】:
-
以及
Object[] objects中存储的内容... -
什么是 com.************************.**********.timecardmanager.MainActivity.sendToServer(MainActivity .java:158) ?
-
另一端的代码是什么样的?注意:您无需将您的
serialVersionUID值保密,这不是安全漏洞。 -
@Selvin JavaTimecards
-
@TooManyEduardos 只是一个空白的包名称。有个人信息。
标签: java android sockets nullpointerexception objectinputstream