Java 未实现可序列化接口的对象序列化
Java object serialized without implementing serializable interface
我有以下代码。
Animal.java
public class Animal{
String name;
int age;
public Animal(){
name="default name";
age=0;
}
}
Cat.java
public class Cat extends Animal{
int legs;
public Cat(){
super();
this.legs=10;
}
}
Test.java
import java.io.*;
public class Test{
public static void main(String[] args){
try{
Cat c1 = new Cat();
FileOutputStream fileStream = new FileOutputStream("myobjects.ser");
ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);
objectStream.writeObject(c1);
}catch(Exception e){
e.printStackTrace();
}
}
}
这段代码没有任何问题。没有抛出异常。我期待一个异常,因为 cat class 没有实现可序列化接口。
为什么我的代码有效?
首先,你不应该去追"Exception"。不好的做法。
其次,如果你想"view"异常,让main()方法抛出NotSerializableException(使用throws)。
程序确实抛出异常,只是您没有找对地方。
方法 e.printStackTrace()
打印到 System.err
(STDERR) 流,NOT 到标准控制台输出 (STDOUT)。您很可能没有查看正确的流。大多数 IDE 会显示 System.err
但我不能代表你。[=19=]
修复方法是调用 System.out.println(e.getMessage())
。这会将异常消息打印到 STDOUT。如果你想打印堆栈跟踪,你应该调用 e.printStackTrace(System.out)
.
最好找到一种查看 System.err
(STDERR) 流的方法,因为典型的 System.out
用于正常程序输出,而不是错误。您可以调用 System.err.println(e.getMessage())
获取异常消息,调用 e.printStackTrace(System.err)
获取堆栈跟踪。
我有以下代码。
Animal.java
public class Animal{
String name;
int age;
public Animal(){
name="default name";
age=0;
}
}
Cat.java
public class Cat extends Animal{
int legs;
public Cat(){
super();
this.legs=10;
}
}
Test.java
import java.io.*;
public class Test{
public static void main(String[] args){
try{
Cat c1 = new Cat();
FileOutputStream fileStream = new FileOutputStream("myobjects.ser");
ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);
objectStream.writeObject(c1);
}catch(Exception e){
e.printStackTrace();
}
}
}
这段代码没有任何问题。没有抛出异常。我期待一个异常,因为 cat class 没有实现可序列化接口。
为什么我的代码有效?
首先,你不应该去追"Exception"。不好的做法。
其次,如果你想"view"异常,让main()方法抛出NotSerializableException(使用throws)。
程序确实抛出异常,只是您没有找对地方。
方法 e.printStackTrace()
打印到 System.err
(STDERR) 流,NOT 到标准控制台输出 (STDOUT)。您很可能没有查看正确的流。大多数 IDE 会显示 System.err
但我不能代表你。[=19=]
修复方法是调用 System.out.println(e.getMessage())
。这会将异常消息打印到 STDOUT。如果你想打印堆栈跟踪,你应该调用 e.printStackTrace(System.out)
.
最好找到一种查看 System.err
(STDERR) 流的方法,因为典型的 System.out
用于正常程序输出,而不是错误。您可以调用 System.err.println(e.getMessage())
获取异常消息,调用 e.printStackTrace(System.err)
获取堆栈跟踪。