0

I'm trying to get this code to run and make an image with a darkened figure. However i continue to get this Run-time error:

java.lang.NullPointerException
    at java.lang.String.<init>(Unknown Source)
    at SimplePicture.<init>(SimplePicture.java:96)
    at SimplePicture.explore(SimplePicture.java:364)
    at Prob04Runner.run(Prob04.java:50)
    at Prob04.main(Prob04.java:8)

My Null Values are necessary for the code.

I don't understand what I'm doing wrong, here is the code and thank you:

import java.awt.Color;
public class Prob04{
  public static void main(String[] args){
    Prob04Runner obj = new Prob04Runner();
    obj.run();
  }//end main
}//end class Prob04
//======================================================//

class Prob04Runner{

  public Prob04Runner(){//constructor
    System.out.println("Display your name here.");
  }//end constructor
  //----------------------------------------------------//

  public void run(){

    Picture skater = new Picture("Prob04a.bmp");
    skater.explore();
    skater = crop(skater,6,59,392,293);

    Picture hole = new Picture("Prob04b.bmp");
    hole.explore();
    hole = crop(hole,6,59,392,293);


    Picture snowScene = new Picture("Prob04c.jpg");
    snowScene.explore();
    snowScene = crop(snowScene,6,59,392,293);

    //Make all the pixels darker in the snow scene except
    // for those in the location of the hole. Make them
    // brighter.
    darkenBackground(hole,snowScene);

    //Apply a red tint to the skater
    redTint(skater);

    //Draw the skater on the snowScene.
    greenScreenDraw(skater,snowScene,0,0);

    //Display students name on the final output and
    // display it.
    snowScene.addMessage("Display your name here.",10,15);

    snowScene.explore();
    System.out.println(snowScene);

  }//end run method
  //----------------------------------------------------//

  //Assumes the source has a pure green background.
  // Applies a red tint to every pixel that is not pure
  // green.
  private void redTint(Picture pic){
    Pixel[] pixels = pic.getPixels();
    Color color = null;
    int red = 0;
    int green = 0;
    int blue = 0;
    for(int cnt = 0;cnt < pixels.length;cnt++){
      color = pixels[cnt].getColor();
      //Apply a red tint to all non-green pixels
      if(!(color.equals(Color.GREEN))){
        //Increase the value of the red component
        red = color.getRed();
        if(red*1.25 < 255){
          red = (int)(red * 1.25);
        }else{
          red = 255;
        }//end else
        //Decrease the value of blue and green
        green = (int)(color.getGreen()*0.8);
        blue = (int)(color.getBlue()*0.8);

        //Apply the new color to the pixel.
        pixels[cnt].setColor(new Color(red,green,blue));
      }//end if
    }//end for loop
  }//end redTint
  //----------------------------------------------------//

  //Assumes the pattern image has a pure green background.
  // Assumes that the pattern and the destination have the
  // same dimensions. Darkens every pixel in the
  // destination that is at the location of a green pixel
  // in the pattern. Applies a red tint to every pixel
  // in the destination that is at the location of a
  // non-green pixel in the pattern
  private void darkenBackground(
                           Picture pattern,
                           Picture dest){

    Pixel[] patternPixels = pattern.getPixels();
    Pixel[] destPixels = dest.getPixels();
    Color color = null;
    int red = 0;
    int green = 0;
    int blue = 0;

    for(int cnt = 0;cnt < patternPixels.length;cnt++){
      color = patternPixels[cnt].getColor();
      if(color.equals(Color.GREEN)){
        //Darken corresponding pixel in the destination.
        color = destPixels[cnt].getColor();
        destPixels[cnt].setColor(color.darker());
      }else{
        //Apply a red tint to the corresponding pixel in
        // the destination.
        color = destPixels[cnt].getColor();
        red = color.getRed();
        if(red*1.25 < 255){
          red = (int)(red * 1.25);
        }else{
          red = 255;
        }//end else
        green = (int)(color.getGreen() * 0.8);
        blue = (int)(color.getBlue() * 0.8);
        destPixels[cnt].setColor(new Color(red,green,blue));
      }//end else
    }//end for loop
  }//end darkenBackground

  private void greenScreenDraw(
                           Picture source,
                           Picture dest,
                           //Place the upper-left corner
                           // of the source image at the
                           // following location in the
                           // destination image.
                           int destX,
                           int destY){
    int width = source.getWidth();
    int height = source.getHeight();
    Pixel pixel = null;
    Color color = null;

    for(int row = 0;row < height;row++){
      for(int col = 0;col < width;col++){
        color = source.getPixel(col,row).getColor();
        if(!(color.equals(Color.GREEN))){
          pixel = dest.getPixel(destX + col,destY + row);
          pixel.setColor(color);
        }//end if
      }//end inner loop
    }//end outer loop

  }//end greenScreenDraw
  //----------------------------------------------------//

  //Crops a Picture object to the given width and height
  // with the upper-left corner located at startCol and
  // startRow.
  private Picture crop(Picture pic,int startCol,
                                   int startRow,
                                   int width,
                                   int height){
    Picture output = new Picture(width,height);

    int colOut = 0;
    int rowOut = 0;
    int col = 0;
    int row = 0;
    Pixel pixel = null;
    Color color = null;
    for(col = startCol;col < startCol+width;col++){
      for(row = startRow;row < startRow+height;row++){
        color = pic.getPixel(col,row).getColor();
        pixel = output.getPixel(colOut,rowOut);
        pixel.setColor(color);
        rowOut++;
      }//end inner loop
      rowOut = 0;
      colOut++;
    }//end outer loop
    return output;
  }//end crop

}//end class Prob04Runner
Roman C
  • 49,761
  • 33
  • 66
  • 176
shurburt
  • 93
  • 2
  • 6
  • 1
    The error you have given says that there is an error in something called from the `explore` method of the `SimplePicture` class, but you have not given us the source of that class and you don't seem to be using it in your own code. – RealSkeptic Jul 02 '15 at 19:55
  • When i run the program i use a class path to call the SimplePicture.class – shurburt Jul 02 '15 at 19:57
  • Possible duplicate of [What is a Null Pointer Exception, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it) – ManoDestra Mar 22 '16 at 18:40
  • If you go to SimplePicture.java at line 96, you will find the offending code, according to the stack trace. – ManoDestra Mar 22 '16 at 18:42

1 Answers1

0

You are probably calling a constructor of String with an argument null which causes the NullPointerException

Usually it is not necessary to call a constructor of String. Just assign it like String x = y. String x = new String(y) is not necessary.

Of course, you have still to find out why your String is null.

edit: If your String needs to be null, don't call the constructor.

For more details, please add the source of the class SimplePicture.

user140547
  • 7,750
  • 3
  • 28
  • 80