I have this code:
public Image toNegative()
{
int imageWidth = originalImage.getWidth();
int imageHeight = originalImage.getHeight();
int [] rgb = n
Your code will throw a NullPointerException because you are never assigning a non-null reference to the rgb variable. Hence, references to it (e.g. rgb[index]) will generate the exception. If you wish to pass in a null array to getRGB you need to ensure you assign the result array returned by the method; e.g.
int[] rgb = originalImage.getRGB(0, 0, imageWidth, imageHeight, rgb, 0,imageWidth);
If you were to uncomment the code commented out there is a bug in that you are allocating the array as imageWidth * imageWidth instead of imageWidth * imageHeight, which is why you're seeing an ArrayIndexOutOfBoundsException.
There are two problems:
The width of the array is not the width of the image but the "scan size" (some image sizes get padded with extra pixels)
If you call getRGB() with a null array, the method will create an array but it won't change the rgb reference - Java doesn't support "out parameters".
To make this work, use
rgb = originalImage.getRGB(0, 0, imageWidth, imageHeight, null, 0,imageWidth);