views:

272

answers:

3

I am trying to write code for an assignment for the c# intro class at my college but am ahead and am running into problems. I am getting a NullReferenceException when i run the program - i think the problem is coming from the fact that i am creating a 'Line' which contains the 'Point' class... i have tried for 3hrs to fix this - any help would be great!!! - also... any programming hints (things that i am doing inefficiently) THANKS!!!

using System;

class Driver
{
    static void Main()
    {
        Point pOne = new Point();
        Point pTwo = new Point(2, 1);

        Console.Write("Point pOne: ");
        PrintPoint(pOne);

        Console.Write("Point pthree: ");
        PrintPoint(pTwo);

        Line lOne = new Line(pOne, pTwo);

        Console.WriteLine("Line lOne: ");
        PrintLine(lOne);

        //Rectangle rOne = new Rectangle();
        Rectangle rOne = new Rectangle(lOne);

        Console.WriteLine("Rectangle rOne: ");
        PrintRectangle(rOne);

        Console.ReadLine();
    }

    // The PrintPoint method
    // purpose: display the coordinates of a Point
    // Parameters: a Point object
    // returns: none
    static void PrintPoint(Point p)
    {
        Console.Write("({0},{1})", p.GetXCoord(), p.GetYCoord());
    }

    // the PrintLine method
    // purpose: display the endpoints of a line
    // Parameters: a Line object
    // returns: none
    static void PrintLine(Line aline)
    {
        // notice how we get the point objects from the line
        // and then print their coordinates
        Point p1 = aline.GetStartPoint();
        Point p2 = aline.GetEndPoint();
        Console.Write("      \t");
        PrintPoint(p1);
        Console.Write(" - ");
        PrintPoint(p2);
    }

    static void PrintRectangle(Rectangle aRec)
    {
        Line Left = aRec.getLeft();
        Line Top = aRec.gettop();
        Line Right = aRec.getRight();
        Line Bottem = aRec.getBottem();

        Console.Write("\t Left: ");
        PrintLine(Left);
        Console.Write("\n\t Top: ");
        PrintLine(Top);
        Console.Write("\n\t Right: ");
        PrintLine(Right);
        Console.Write("\n\t Bottem: ");
        PrintLine(Bottem);

    }
}

class Rectangle
{
    private Line left;
    private Line top;
    private Line right;
    private Line bottem;


    public Rectangle()
  {
        Point zero = new Point();

        left.setEndPoint(zero);
        left.SetStartPoint(zero);

        top.setEndPoint(zero);
        top.SetStartPoint(zero);

        right.setEndPoint(zero);
        right.SetStartPoint(zero);

        bottem.setEndPoint(zero);
        bottem.SetStartPoint(zero);

    }

    public Rectangle(Line enter)
    {
        Point stDgl = new Point();
        Point endDgl = new Point();

        stDgl = enter.GetStartPoint();
        endDgl = enter.GetEndPoint();

        //stDgl
        int a = stDgl.GetXCoord();
        int b = stDgl.GetYCoord();

       //endDgl
        int c = endDgl.GetXCoord();
        int d = endDgl.GetYCoord();

        Point endright = new Point();

        endright.SetXCoord(c);
        endright.SetYCoord(b);

        Point endleft = new Point();

        endleft.SetXCoord(a);
        endleft.SetYCoord(d);

        //LEFT
********left.SetStartPoint(stDgl);            - *NullReferenceException* -
        left.setEndPoint(endleft); 

        //TOP
        top.SetStartPoint(endleft);
        top.setEndPoint(endDgl);

        //RIGHT
        right.SetStartPoint(endDgl);
        right.setEndPoint(endright);

        //BOTTEM
        bottem.SetStartPoint(endright);
        bottem.setEndPoint(stDgl);
    }

    public Line getLeft()
    {
        return left;
    }

    public Line gettop()
    {
        return top;
    }

    public Line getRight()
    {
        return right;
    }

    public Line getBottem()
    {
        return bottem;
    }

}

// the Line class  
class Line
{
    // data members - notice that they are Point objects
    private Point startPoint;
    private Point endPoint;

    // default constructor
    // purpose: initialize data members to zero
    // Parameters: none
    // returns: none
    public Line()
    {
        // notice how we call methods in the Point class
        **startPoint.SetXCoord(0);**         ***NullReferenceException***
        startPoint.SetYCoord(0);
        endPoint.SetXCoord(0);
        endPoint.SetYCoord(0);
    }

    // parameterized constructor
    // purpose: initialize data members to p1 and p2
    // Parameters: Point objects p1 and p2
    // returns: none
    public Line(Point p1, Point p2)
    {
        startPoint = p1;
        endPoint = p2;
    }

    /*
            //LEFT
            Point endleft = new Point();

            endleft.SetXCoord(a);
            endleft.SetYCoord(d);

            left.SetStartPoint(stDgl);
            left.setEndPoint(endleft);
     * */


    // the GetStartPoint method
    // purpose: return the value of the starting point
    // Parameters: none
    // returns: the value of the starting point as a Point object
    public Point GetStartPoint()
    {
        return startPoint;
    }

    // the GetEndPoint method
    // purpose: return the value of the ending point
    // Parameters: none
    // returns: the value of the ending point as a Point object
    public Point GetEndPoint()
    {
        return endPoint;
    }

    // the SetStartPoint method
    // purpose: store the value of the starting point
    // Parameters: the value of the starting point as a Point object
    // returns: none
    public void SetStartPoint(Point p1)
    {
        startPoint = p1;
    }

    // the SetEndPoint method
    // purpose: store the value of the ending point
    // Parameters: the value of the ending point as a Point object
    // returns: none
    public void setEndPoint(Point p2)
    {
        endPoint = p2;
    }
}

// The Point class
class Point
{
    // data members
    private int xCoord;
    private int yCoord;

    // default constructor
    // purpose: initialize data members to zero
    // Parameters: none
    // returns: none
    public Point()
    {
        xCoord = 0;
        yCoord = 0;
    }

    // parameterized constructor
    // purpose: initialize data members to x an y
    // Parameters: two integers x and y
    // returns: none
    public Point(int x, int y)
    {
        xCoord = x;
        yCoord = y;
    }

    // the GetXCoord method
    // purpose: return the value of the x-coordinate
    // Parameters: none
    // returns: the value of the x-coordinate as an int
    public int GetXCoord()
    {
        return xCoord;
    }

    // the GetYCoord method
    // purpose: return the value of the y-coordinate
    // Parameters: none
    // returns: the value of the y-coordinate as an int
    public int GetYCoord()
    {
        return yCoord;
    }

    // the SetXCoord method
    // purpose: stores the value of the x-coordinate
    // Parameters: the value of the x-coordinate as an int
    // returns: none
    public void SetXCoord(int x)
    {
        xCoord = x;
    }

    // the SetYCoord method
    // purpose: stores the value of the y-coordinate
    // Parameters: the value of the y-coordinate as an int
    // returns: none
    public void SetYCoord(int y)
    {
        yCoord = y;
    }
}
+9  A: 

You're trying to set members of objects before you've created them. For example:

class Line
{
    private Point startPoint;
    private Point endPoint;

    public Line()
    {
        startPoint.SetXCoord(0);
        ...

At the start of the constructor, startPoint will be a null reference. You need to create a new Point object and assign the reference to startPoint , like this:

startPoint = new Point();
startPoint.SetXCoord(0); // etc

I also suggest you change get/set methods to properties as soon as you feel up to it - that way your code will look much more like idiomatic C# than Java.

Jon Skeet
I think his problem is that he's expecting the constructor to chain to the default constructor by default, which of course it doesn't...
Reed Copsey
@Reed: That may help with the Rectangle constructor, but it doesn't help with the Line constructor I've shown here.
Jon Skeet
Very true :) I noticed the other one, but I think its partly a lack of understanding of how construction works.
Reed Copsey
+2  A: 

you must call new on those Point objects before you use them otherwise they remain null which throws that null reference exception...

startPoint = new Point();
endPoint = new Point();
Muad'Dib
+5  A: 

When you do this:

public Rectangle(Line enter)
{ 
   // ...

You are actually creating a new constructor. This one will run, but your default constructor will not run.

I'm guessing you're expecting the default constructor public Rectangle() to have run as well. You can easily accomplish this by using constructor chaining.

public Rectangle(Line enter) : this() // Call the default constructor as well
{ 
   // ...

That would eliminate your null reference exception, and give you the behavior I think you're expecting.

However, I'd also recommend reading some of the advice in other posts, especially Tony the Pony's - the provide some good suggestions, such as using properties.

Reed Copsey