Maha and I went off-line and resolved this issue, which was just a Java programming error. Cheers, --Matt
On Mar 17, 2011, at 4:41 PM, maha wrote: Thanks for your time Matt. Below are my clarifications ... > There are three things missing from your simplified code needed to give a > definitive answer, so I'll infer them as follows: > - the specification of "twoIntegers" > "twoIntegers" seems to be a tuple of ints with get/set accessors, so it > is an object (array of primitives?) not a primitive, right? public class twoIntegers () { private int x; private int y; ..... } so it's not an array. That's why I didn't use the ArrayWritable (although I tried but I didn't succeed). > - in the exception > "twoIntegersArrayWritable.readFields(twoIntegersArrayWritable.java:46)", what > line 46 refers to > I'm betting it refers to the line > "this.vector[i].setFirstInteger(in.readInt());" Yes it is . After some investigation, it turns that 'in' is empty at this line, but it's because even though in the write function I have : for(int i=0;i<this.vectorSize;i++) out.writeInt( vector[i]. getFirstIntger()); out.writeInt( vector[i]. getSecondIneger()); but vectorSize is 0 ! so that's why nothing is written after vectorSize into DataOutputStream in the first place to be read later :( although the initialization of the class specifies clearly that the size is 10. > - the implementation of CreateNewVector(size) > It seems likely it just does a "new twoIntegers[size];" Yes this is what I meant to do , because I wanted to make sure that my array is not of size 0, but it's still of size zero. > > If the above is correct, then the problem is that standard Java behavior is > to fill the new array with nulls rather than with empty twoInteger objects. > So in readFields(), when you enter the loop to read values for vector, the > code "this.vector[0]" fetches a null object, and the continuation > "this.vector[0].setFirstInteger()" causes a NullPointerException. > Do you mean I have to use Integer objects instead of primitive types ?? > You can fix this in CreateNewVector(), by explicitly allocating a new > twoInteger object for each location in the "vector" array, or in the > readFields() loop, whichever suits your program semantics better. > > --Matt > > > On Mar 17, 2011, at 2:04 PM, maha wrote: > > Hello, > > I'm stuck with this for two days now ...I found a previous post discussing > this, but not with arrays. > > I know how to write Writable class with primitive type elements but this time > I'm using an ARRAY of primitive type element, here it is in a simplified > version for easy readability : > > public class twoIntegersArrayWritable implements Writable { > > private int vectorSize; > private twoIntegers[] vector ; > > /* CONSTRUCTORS */ =================================================== > > twoIntegersArrayWritable () {} > > twoIntegersArrayWritable (int size, twoIntegers[] vec) { > this.vectorSize = size; > this.vector = vec; > } > > /* WRITE FUNCTION */ > =================================================== > > public void write(DataOutput out) { > > out.writeInt(this.vectorSize); > for(int i=0;i<this.vectorSize;i++){ > out.writeInt( vector[i]. getFirstIntger()); > out.writeInt( vector[i]. getSecondIneger()); > } > } > > /* READ FUNCTION */ > =================================================== > > public void readFields(DataInput in) throws IOException { > > this.vectorSize = in.readInt(); > this.CreateNewVector (this.vectorSize); > for(int i=0;i< this.vectorSize;i++){ > this.vector[i].setFirstInteger(in.readInt()); > this.vector[i].setSecondInteger(in.readInt()); > } > } > } > > The errors I get: > java.lang.NullPointerException > at twoIntegersArrayWritable.readFields(twoIntegersArrayWritable.java:46) > at > org.apache.hadoop.io.SequenceFile$Reader.getCurrentValue(SequenceFile.java:1751) > at org.apache.hadoop.io.SequenceFile$Reader.next(SequenceFile.java:1879) > at SequenceFileReader_Integers.main(SequenceFileReader_Integers.java:49) > > Or it would work fine but array size is always 0. So it won't read the > integer fields. > > It would be helpful if someone already has an example of using array in their > Writable class. I appreciate any thought. > > Maha > >