Java构造函数NullPointerException问题
我在理解如何创建子类的构造函数(它扩展父类)时遇到了一些问题。下面是我使用的代码: 父类构造函数:Java构造函数NullPointerException问题,java,android,constructor,nullpointerexception,Java,Android,Constructor,Nullpointerexception,我在理解如何创建子类的构造函数(它扩展父类)时遇到了一些问题。下面是我使用的代码: 父类构造函数: public RPCPacket( int apacketId, RPCPacketType apacketType, RPCOperationType aoperationType, String tmpPacket_objectOid,
public RPCPacket( int apacketId,
RPCPacketType apacketType,
RPCOperationType aoperationType,
String tmpPacket_objectOid,
int aobjectId,
int adataSize,
String tmpPacket_dataHash,
RPCPacketDataType adataType,
byte[] apacketData){
RPCPacket packet=null;
switch(apacketType){
case ST_OBJECT_TYPE_INFO_START:
{
packet = new InfoStartRPCPacket();
break;
}
case ST_OBJECT_TYPE_INFO_END:
{
packet = new InfoEndRPCPacket();
break;
}
case ST_OBJECT_TYPE_INFO_ERROR:
{
packet = new InfoErrorRPCPacket();
break;
}
// Basic packets
case ST_OBJECT_TYPE_COLLECTION:
{
packet = new CollectionRPCPacket();
break;
}
case ST_OBJECT_TYPE_CATEGORY:
{
packet = new CategoryRPCPacket();
break;
}
case ST_OBJECT_TYPE_CARD:
{
packet = new CardRPCPacket();
break;
}
case ST_OBJECT_TYPE_MESSAGE:
{
packet = new MessageRPCPacket();
break;
}
case ST_OBJECT_TYPE_GENRE:
{
packet = new GenreRPCPacket();
break;
}
case ST_OBJECT_TYPE_TAG:
{
packet = new TagRPCPacket();
break;
}
case ST_OBJECT_TYPE_USER:
{
packet = new UserRPCPacket();
break;
}
case ST_OBJECT_TYPE_CARDSTATS_CATEGORY:
{
packet = new CardStatsCategoryRPCPacket();
break;
}
case ST_OBJECT_TYPE_CONTENT:
{
packet = new ContentRPCPacket();
break;
}
// Media packets
case ST_OBJECT_TYPE_MEDIA_COLLECTION:
{
packet = new MediaCollectionRPCPacket();
break;
}
case ST_OBJECT_TYPE_MEDIA_CATEGORY:
{
packet = new MediaCategoryRPCPacket();
break;
}
case ST_OBJECT_TYPE_MEDIA_CARD:
{
packet = new MediaCardRPCPacket();
break;
}
case ST_OBJECT_TYPE_MEDIA_TAG:
{
packet = new MediaTagRPCPacket();
break;
}
case ST_OBJECT_TYPE_MEDIA_COLLECTION_BUTTON:
{
packet = new MediaCollectionButtonRPCPacket();
break;
}
// unknown packet
default:
{
packet=null;
break;
}
}
}
子类构造函数:
static int apacketId;
static RPCPacketType apacketType;
static RPCOperationType aoperationType;
static String tmpPacket_objectOid;
static int aobjectId;
static int adataSize;
static String tmpPacket_dataHash;
static RPCPacketDataType adataType;
static byte[] apacketData;
public InfoStartRPCPacket() {
super(apacketId, apacketType, aoperationType, tmpPacket_objectOid, aobjectId,
adataSize, tmpPacket_dataHash, adataType, apacketData);//line 46 from LogCat error
}
以及LogCat例外情况:
09-08 11:18:05.614: WARN/System.err(3376): java.lang.NullPointerException
09-08 11:18:05.614: WARN/System.err(3376): at com.stampii.stampii.comm.rpc.RPCPacket.<init>(RPCPacket.java:68)
09-08 11:18:05.614: WARN/System.err(3376): at com.stampii.stampii.comm.rpc.InfoStartRPCPacket.<init>(InfoStartRPCPacket.java:46)
09-08 11:18:05.614: WARN/System.err(3376): at com.stampii.stampii.comm.rpc.RPCPacket.<init>(RPCPacket.java:71)
09-08 11:18:05.614: WARN/System.err(3376): at com.stampii.stampii.user.UserLogin$2.onClick(UserLogin.java:122)
09-08 11:18:05.614: WARN/System.err(3376): at android.view.View.performClick(View.java:2408)
09-08 11:18:05.614: WARN/System.err(3376): at android.view.View$PerformClick.run(View.java:8817)
09-08 11:18:05.614: WARN/System.err(3376): at android.os.Handler.handleCallback(Handler.java:587)
09-08 11:18:05.614: WARN/System.err(3376): at android.os.Handler.dispatchMessage(Handler.java:92)
09-08 11:18:05.614: WARN/System.err(3376): at android.os.Looper.loop(Looper.java:144)
09-08 11:18:05.614: WARN/System.err(3376): at android.app.ActivityThread.main(ActivityThread.java:4937)
09-08 11:18:05.614: WARN/System.err(3376): at java.lang.reflect.Method.invokeNative(Native Method)
09-08 11:18:05.614: WARN/System.err(3376): at java.lang.reflect.Method.invoke(Method.java:521)
09-08 11:18:05.614: WARN/System.err(3376): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-08 11:18:05.614: WARN/System.err(3376): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-08 11:18:05.624: WARN/System.err(3376): at dalvik.system.NativeStart.main(Native Method)
09-08 11:18:05.614:WARN/System.err(3376):java.lang.NullPointerException
09-08 11:18:05.614:WARN/System.err(3376):位于com.stampii.stampii.comm.rpc.RPCPacket.(RPCPacket.java:68)
09-08 11:18:05.614:WARN/System.err(3376):位于com.stampii.stampii.comm.rpc.InfoStartRPCPacket.(InfoStartRPCPacket.java:46)
09-08 11:18:05.614:WARN/System.err(3376):位于com.stampii.stampii.comm.rpc.RPCPacket.(RPCPacket.java:71)
09-08 11:18:05.614:WARN/System.err(3376):位于com.stampii.stampii.user.UserLogin$2.onClick(UserLogin.java:122)
09-08 11:18:05.614:WARN/System.err(3376):在android.view.view.performClick(view.java:2408)
09-08 11:18:05.614:WARN/System.err(3376):在android.view.view$PerformClick.run(view.java:8817)
09-08 11:18:05.614:WARN/System.err(3376):位于android.os.Handler.handleCallback(Handler.java:587)
09-08 11:18:05.614:WARN/System.err(3376):位于android.os.Handler.dispatchMessage(Handler.java:92)
09-08 11:18:05.614:WARN/System.err(3376):位于android.os.Looper.loop(Looper.java:144)
09-08 11:18:05.614:WARN/System.err(3376):位于android.app.ActivityThread.main(ActivityThread.java:4937)
09-08 11:18:05.614:WARN/System.err(3376):位于java.lang.reflect.Method.invokenactive(本机方法)
09-08 11:18:05.614:WARN/System.err(3376):位于java.lang.reflect.Method.invoke(Method.java:521)
09-08 11:18:05.614:WARN/System.err(3376):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-08 11:18:05.614:WARN/System.err(3376):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-08 11:18:05.624:WARN/System.err(3376):在dalvik.System.NativeStart.main(本机方法)
有什么建议可以解决我的问题吗?您似乎没有设置或初始化任何传递到超级构造函数的变量-因此任何对象引用的变量都将为空。您似乎没有设置或初始化任何传递到超级构造函数的变量-因此任何对象引用的变量都将为空空。检查代码中的第68行(
RPCPacket.java:68
)。因为这里没有相关的行号,所以我无法理解。似乎您正在访问对象上的某个方法/属性,而没有对其进行初始化。查看代码中的第68行(RPCPacket.java:68
)。因为这里没有相关的行号,所以我无法理解。似乎您正在访问对象上的某个方法/属性而没有对其进行初始化。您的RPCPacketType为null,switch()语句引发null指针异常,因为它无法计算apacketType。您的RPCPacketType为null,switch()为空语句引发null指针异常,因为它无法计算ApackeType。您得到NullPointerException是因为(我假设)您没有实例化构造函数中使用的任何静态变量。在调用InfoStartRPCPacket()
之前,需要传入这些参数的值
然而,对我来说,这看起来像是一个坏的OO,除非您有在子类中使用静态变量的特殊需要,否则我建议您的子构造函数应该使用父类的参数,以便您可以在子类中优雅地使用超级(…)
构造函数。像这样:
InfoStartRPCPacket(
int apacketId,
RPCPacketType apacketType,
RPCOperationType aoperationType,
String tmpPacket_objectOid,
int aobjectId,
int adataSize,
String tmpPacket_dataHash,
RPCPacketDataType adataType,
byte[] apacketData) {
super(apacketId, apacketType, aoperationType, tmpPacket_objectOid, aobjectId,
adataSize, tmpPacket_dataHash, adataType, apacketData);
//your custom constructor code here
}
这样,在调用构造函数(一种称为顺序耦合的反模式)之前,没有人需要知道如何实例化所有静态类型变量
更好的是,如果您在InfoStartRPCPacket中没有额外的工作要做,那么完全省去子构造函数方法。它将简单地继承父级的构造函数。您将获得NullPointerException,因为(我假设)您没有实例化构造函数中使用的任何静态变量。在调用
InfoStartRPCPacket()
之前,需要传入这些参数的值
然而,对我来说,这看起来像是一个坏的OO,除非您有在子类中使用静态变量的特殊需要,否则我建议您的子构造函数应该使用父类的参数,以便您可以在子类中优雅地使用超级(…)
构造函数。像这样:
InfoStartRPCPacket(
int apacketId,
RPCPacketType apacketType,
RPCOperationType aoperationType,
String tmpPacket_objectOid,
int aobjectId,
int adataSize,
String tmpPacket_dataHash,
RPCPacketDataType adataType,
byte[] apacketData) {
super(apacketId, apacketType, aoperationType, tmpPacket_objectOid, aobjectId,
adataSize, tmpPacket_dataHash, adataType, apacketData);
//your custom constructor code here
}
这样,在调用构造函数(一种称为顺序耦合的反模式)之前,没有人需要知道如何实例化所有静态类型变量
更好的是,如果您在InfoStartRPCPacket中没有额外的工作要做,那么完全省去子构造函数方法。它将简单地继承父级的构造函数