0

I have a little problem understanding how to create a child class's contructor, which extends Parent class.Here is the code that I'm using :

Parent class constructor :

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;
            }
        }

    }

Child class constructor :

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
    }

And the LogCat Exception :

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)

Any suggestions how to fix my issue?

Android-Droid
  • 14,365
  • 41
  • 114
  • 185

4 Answers4

3

You're getting NullPointerException because (I assume) you didn't instantiate any of the static variables you're using in your constructor. You need to pass in values for those parameters before calling InfoStartRPCPacket().

However, this looks like a case of bad OO to me and unless you have a very specific need to use static variables in your child class, I would suggest that your child constructor should take the arguments of the parent so you can gracefully use the super(...) constructor in your child. Like so:

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
}

This way, no one has to know to instantiate all the static type variables before calling the constructor (an anti-pattern known as Sequential Coupling).

Better yet, if you have no additional work to be done in the InfoStartRPCPacket, leave out the child constructor method altogether. It will simply inherit the parent's constructor.

ajsharma
  • 1,188
  • 1
  • 10
  • 17
0

You don't appear to set or initialise any of the variables you pass into the super-constructor - so any of them that are object references will be null.

Russell
  • 12,261
  • 4
  • 52
  • 75
0

Check out the line 68 in your code (RPCPacket.java:68). Since there are no relevant line numbers here, I cannot figure this out. Seems you are accessing some method/property on an object without initializing it.

Santosh
  • 17,667
  • 4
  • 54
  • 79
0

Your RPCPacketType is null and the switch() statement is raising the null pointer exception because it cannot evaluate apacketType.

mcfinnigan
  • 11,442
  • 35
  • 28