I faced a null pointer exception when I tried to retrieve an object from a normal array. First I initialize the array with 10 Line objects and then set the values of each object inside the array. But when I retrieve the values of any objects, I found it to be 0’s. Why does that happen?
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class LineArrayLimt extends Applet
implements MouseListener, MouseMotionListener {
int width, height;
int x, y, lineCounter; // the coordinates of the upper-left corner of the box
int mx, my; // the most recently recorded mouse coordinates
int new_mx;
int new_my;
Thread th;
boolean isMouseDragging = false, isStored;
Line[] lines = new Line[10];
class Line {
Line() {
}
Line(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
private int x1, y1, x2, y2;
public void setX1(int x) {
this.x1 = x;
}
public void setY1(int y) {
this.y1 = y;
}
public void setX2(int x) {
this.x2 = x;
}
public void setY2(int y) {
this.y2 = y;
}
public int getX1() {
return x1;
}
public int getY1() {
return y1;
}
public int getX2() {
return x2;
}
public int getY2() {
return y2;
}
}
public void init() {
width = getSize().width;
height = getSize().height;
setBackground(Color.black);
addMouseListener(this);
addMouseMotionListener(this);
for (int i = 0; i < lines.length; i++) {
lines[i] = new Line();
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
System.out.println("-----------------Mouse Pressed------------------------");
mx = e.getX();
my = e.getY();
}
public void mouseReleased(MouseEvent e) {
System.out.println("-----------------Mouse Released------------------------");
if (isMouseDragging) {
if (lineCounter != lines.length - 1) {
lines[lineCounter].setX1(mx);
lines[lineCounter].setY1(my);
lines[lineCounter].setX2(new_mx);
lines[lineCounter].setY2(new_my);
lineCounter++;
if (lines[lineCounter] != null) {
System.out.println("-----------------First Object------------------------" + lines[lineCounter].getX1() + " " + lines[lineCounter].getY1() + " " + lines[lineCounter].getX2() + " " + lines[lineCounter].getY1());
}
}
}
isMouseDragging = false;
}
public void mouseMoved(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
System.out.println("-----------------Mouse Dragged------------------------");
isMouseDragging = true;
new_mx = e.getX();
new_my = e.getY();
if (new_mx <= 35) {
new_mx = 35;
}
if (new_mx > width - 40) {
new_mx = width - 40;
}
if (new_my > height - 40) {
new_my = height - 40;
}
if (new_my < 35) {
new_my = 35;
}
repaint();
}
public void paint(Graphics g) {
System.out.println("-----------------Line No." + lineCounter + " is inside paint------------------------");
g.setColor(Color.RED);
if (isMouseDragging) {
System.out.println("-----------------Paint while dragging------------------------");
g.drawLine(mx, my, new_mx, new_my);
if (lineCounter != lines.length - 1) {
//if(lines[lineCounter]!=null){
g.drawLine(lines[lineCounter].getX1(), lines[lineCounter].getY1(), lines[lineCounter].getX2(), lines[lineCounter].getX2());
System.out.println("*************" + lines[lineCounter].getX1() + lines[lineCounter].getY1() + lines[lineCounter].getX2() + lines[lineCounter].getX2());
//}
}
}
}
}
The problem is that in init you’re initializing
linesto an array of 10 null references:Then in
paintyou’re using that null reference:lines.lengthwill always be 10 – it isn’t the number of non-null references in the array. It’s not the number of lines you’ve added, or anything like that. (It’s not clear what yourifcondition is trying to achieve, to be honest.)You’d be better off using a
List<Line>instead. Then inpaintyou could just use:… and in
mouseReleasedyou’d just use:Also note that there’s no reason for
Lineto be an inner class. Either make it a static nested class, or a top-level (non-nested) class.