NullPointerException when accessing 2D array - java

First, here is my function "setProduct" :
public void setProduct(String code, int qty,double price,int nbrProduct){
System.out.println("Code = "+code);
System.out.println("qty = "+qty);
System.out.println("price = "+price);
System.out.println("nbrProduct = "+nbrProduct);
this.Produit[nbrProduct][0] = code;
this.Produit[nbrProduct][1] = Integer.toString(qty);
this.Produit[nbrProduct][2] = price+" €";
And now where I call :
Commande_Final Commande = new Commande_Final();
Commande = Cmd;
String name = Commande.getName();
double prixUnit = Function.GetMagPrice(radar,Qtyradar)/Qtyradar;
System.out.println("j'affiche le radar : "+name);
System.out.println("j'affiche le Qtyradar : "+Qtyradar);
System.out.println("j'affiche le prix du radar : "+prixUnit+" €");
System.out.println("nbr de produit = "+nbr_de_Produit);
Commande.setProduit(name,Qtyradar,prixUnit,nbr_de_Produit);
My problem :
I get an error when I do in "setProduct" => this.Produit[nbrProduct][0] = code;
The error says "java.lang.NullPointerException", I guess its trying to put an empty value in "this.Produit[nbrProduct][0]" but the thing is when I do the "System.out.println("Code = "+code);" its show me the correct code and the same for all others attributs :/
EDIT :
Here is how I create my Produit attribut :
public String[][] Produit = new String[99][3];
EDIT 2 :
stack trace :
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Commande_Final.setProduit(Commande_Final.java:33)
at ZDialogInfo.Confirmer(ZDialogInfo.java:449)
at ZDialogV2$29.actionPerformed(ZDialogV2.java:1037)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
The code (sorry I leave in french, then you see the real name I use):
public void Confirmer(boolean LoginCheck,String Nom,ZDialogInfo zInfo,final String Langue, Commande_Final Cmd) throws IOException{
Commande_Final Commande = Cmd;
...
if (Qtyradar > 0){
/*
* PROBLEME ICI
*
* */
String name = Commande.showName();
double prixUnit = Function.GetMagPrice(radar,Qtyradar)/Qtyradar;
System.out.println("j'affiche le radar : "+name);
System.out.println("j'affiche le Qtyradar : "+Qtyradar);
System.out.println("j'affiche le prix du radar : "+prixUnit+" €");
System.out.println("nbr de produit = "+nbr_de_Produit);
/*ZDialogInfo.Confirmer(ZDialogInfo.java:449) => */
Commande.setProduit(name,Qtyradar,prixUnit,nbr_de_Produit);
nbr_de_Produit++;
System.out.println("nbr de produit = "+nbr_de_Produit);
JP_CNom.add(JL_CRadar);
JP_CNom.add(JL_CQtyRadar);
JP_CNom.add(JL_CPrixRadar);
if (RnbrItem >= 1) JP_CNom.add(RCompo1);
if (RnbrItem >= 2) JP_CNom.add(RCompo2);
if (RnbrItem >= 3) JP_CNom.add(RCompo3);
}
My public class Commande_Final
public class Commande_Final {
private String[][] Produit = new String[MAX_Produit][3];
/*
*
* [Nbr de Produit][0] = Code_Item
* [Nbr de Produit][1] = Qty_Cmdé
* [Nbr de Produit][2] = Prix_Unitaire
*
* */
public void setProduit(String code, int qty,double prix,int nbrProduit){
System.out.println(" ------------------- Dans setProduit ---------------------- ");
System.out.println("Code = "+code);
System.out.println("qty = "+qty);
System.out.println("prix = "+prix);
System.out.println("nbrProduit = "+nbrProduit);
/*at Commande_Final.setProduit(Commande_Final.java:33) =>*/ this.Produit[nbrProduit][0] = code;
this.Produit[nbrProduit][1] = Integer.toString(qty);
this.Produit[nbrProduit][2] = prix+"";
}

Most probably you haven't set up the array correctly.
A simplest example:
Foo[] foo = new Foo[10];
it is just making an array with 10 reference to Foo, however there is no actual Foo object those reference is pointing to. Hence it will cause NPE when you are trying to access foo[0].bar()
Similar,
Product[][] product = new Product[10][];
is going to give u an array of 10 reference pointing to Product[]. However there is no actual Product array object created. Therefore similar to the above example, you will get NPE if you do product[1][0], because product[1] is point to null, NPE is thrown because you want to access [0] of that null Product[] reference. You need to instantiate them explicitly.
Update:
With the extra code that OP quoted, I have tried to run that and there is no NPE from that piece of code.
It is most probably that, you have reassigned your produit (I would strongly recommend you follow Java's common naming convention) to null, or assigned produit[n] to null in some other code.
I would suggest a quick check on which one is null:
Add before your assignment:
System.out.println("produit null ? " + (produit == null));
System.out.println("produit[n] null ? " + (produit[nbrProduit] == null));
it should tell you which one is null, and give you hints where you may have incorrect updated the reference.

Problem
According to your stack trace, NPE is caused by this line:
this.Produit[nbrProduct][0] = code;
Apparently, you found out via console output that what is null here is this.Produit.
Possible Cause
Since you said you initialized Produit with the following line:
private String[][] Produit = new String[99][3];
then your NPE should not happen, unless you have reset the reference to null somewhere via some code like:
Commande.Produit = null;
Finding write accesses
If you're using Eclipse, there is a way to find every write access to your attribute:
click on your attribute Produit in your Commande_Final class, so that it is highlighted
go to Search > Write Access > Project
check if there is any other write access than your initialization

My guess is that this.Produit[nbrProduct] is null.
It can be initialized: this.Produit[nbrProduct] = new String[someSize];

Assigning null never causes a NPE, the issue must be your array has been not initialized.
The array is initialized when the object is created, so my guess is that array is re-assigned before the setProduct method is called. Check if this.Produit[nbrProduct] is not null when setProduct is called.
PS: Please, use Java conventions: method, attribute and variable names start with lowcase, class/interface names start with uppercase. In general try to use CamelCase (except constants, that should be LIKE_THIS_EXAMPLE)

Related

java Null Pointer exception in Noughts and Crosses project

I have been working on a project and the project is to create a game of Noughts and Crosses. I have already established the groundwork for the game and I'm currently developing it further. However , when I run the program and the AI is chosen to make the first move , I was returned a Java Null pointer exception in this line :
if(Game.Board[0][0].getText().equals(Game.Board[1][1].getText()) && Game.Board[0][0].getText().equals(Game.PlayerMark))
Game.Board[a][b] consists of 3x3 Jbuttons. PlayerMark is a string that either can contain "X" or "O".
How to solve this problem?
Where AI method is being called:
public void StartGame()
{
SideAssigner();
State = true;
if ( AIGame == true && FirstTurn ==true)
{
Computer.AI();
}
while ( State = true )
{
WinValidator();
}
}
Message in console box :
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Computer.AI(Computer.java:19)
at Game.StartGame(Game.java:179)
at Game$10.actionPerformed(Game.java:739)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Sour
Update :
Here is an example of how each JBUtton's properties are determined:
Button1.setText("");
Button1.setEnabled(false);
Button1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if ( State == true && playerO == true && PlayerGame == true )
{
isEmpty = false;
Button1.setText("O");
// WinValidator
// TurnChecker ??
}
else if ( State == true && playerX == true && PlayerGame == true )
{
isEmpty = false;
Button1.setText("X");
// WinValidator
// TurnChecker
}
else if ( State == true && computerO == true && AIGame == true)
{
isEmpty = false;
// Call Computer Class
// WinValidator
// TurnChecker
}
else if ( State == true && computerX == true && AIGame == true)
{
isEmpty = false;
// Call Computer Class
// WinValidator
// TurnChecker
}
}
});
AI Method ( snippet of it otherwise it would be too much to display) :
public static void AI()
{
for(int i=0; i<3; i++ )
{
for (int j=0; j<3; j++)
{
// Diagonal Defensive Strategy
if(Game.Board[0][0].getText().equals(Game.Board[1][1].getText()) && Game.Board[0][0].getText().equals(Game.PlayerMark))
{
if( !Game.Board[2][2].getText().equals(Game.ComputerMark) && !Game.Board[2][2].getText().equals(Game.PlayerMark))
{
Game.Board[2][2].setText(Game.ComputerMark);
MadeMove = true;
return;
}
}
if(Game.Board[2][2].getText().equals(Game.Board[1][1].getText()) && Game.Board[2][2].equals(Game.PlayerMark))
{
if( Game.Board[0][0].getText().equals(Game.ComputerMark) && !Game.Board[0][0].getText().equals(Game.PlayerMark))
{
Game.Board[0][0].setText(Game.ComputerMark);
MadeMove = true;
return;
}
}
if(Game.Board[0][0].getText().equals(Game.Board[1][1].getText()) && Game.Board[0][0].getText().equals(Game.PlayerMark))
{
if( !Game.Board[2][2].getText().equals(Game.ComputerMark) && !Game.Board[2][2].getText().equals(Game.PlayerMark))
{
Game.Board[2][2].setText(Game.ComputerMark);
MadeMove = true;
return;
}
}
Here is how to solve a NullPointerException. You should learn how to solve these problems yourself as you will get a lot of them:
Look at your stack trace:
at Computer.AI(Computer.java:19)
at Game.StartGame(Game.java:179)
Find the line at the top of the trace:
if(Game.Board[0][0].getText().equals(Game.Board[1][1].getText()) && Game.Board[0][0].getText().equals(Game.PlayerMark))
If you can't see the error, split the line up into smaller statements:
tmp = Game.Board[0];
tmp2 = tmp1[0];
tmp3 = Game.Board[1];
tmp4 = tmp3[1];
etc, etc - I am not sure what the types are, but you will know that.
Run it again and see where it falls over. The line number will now tell you exactly which statement has failed. The reference in that statement must be null.
If you don't know why the reference is null, follow the logic back and repeat the changes above.
You could also learn to use the debugger in an IDE such as Eclipse.

Combobox Selected Item

Here is my array of Strings :
String[] selection = { "0 + 0", "0.88 + 0.21", "-0.21 + 0.77", "-1.23 + 0.03" };
I then create a JComboBox:
JComboBox<String> jcb = new JComboBox<String>(selection);
jcb.addActionListener(new ComboListener());
Here is the ActionListener :
public class ComboListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JComboBox<String> cb = (JComboBox<String>) e.getSource();
String selection = (String) cb.getSelectedItem();
String[] parts = selection.split(" + ");
System.out.println(parts[0]);
System.out.println(parts[1]);
}
}
Here's what is printed out when I select an option, say 0.88 + 0.21:
0.88 + 0.21
With the error:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1
at GUI$ComboListener.actionPerformed(GUI.java:140)
at javax.swing.JComboBox.fireActionEvent(Unknown Source)
at javax.swing.JComboBox.setSelectedItem(Unknown Source)
at javax.swing.JComboBox.setSelectedIndex(Unknown Source)
at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Anyone got any idea where I'm going wrong? My logic of splitting up the string seems to be fine. Many thanks;
split takes a regular expression as parameter. But + is a special regexp character. So you need to escape it:
String[] parts = selection.split(" \\+ ");
Another solution would be to use Pattern.quote:
String[] parts = selection.split(Pattern.quote(" + "));
String[] selection = {"0 + 0", "0.88 + 0.21", "-0.21 + 0.77", "-1.23 + 0.03"};
for(String s : selection){
System.out.println(Arrays.toString(s.split(" \\+ ")));
}
Successfully prints:
[0, 0]
[0.88, 0.21]
[-0.21, 0.77]
[-1.23, 0.03]
As the exception points out, the split doesn't work the way you intended (thought it would):
selection.split(" + ");
The problem is that split takes a regular expression so you need to escape the +
selection.split(" \\+ ");

NullPointerException that should not occur

I am sorry to post that in case it is just something stupid I am doing, but I hope there is some weird Java thing causing this that I am unaware of and can that will help others. Am I overlooking something here? Why the NPE?
Here is my code:
SwingUtilities.invokeLater(new Runnable() {
#Override
public void run() {
int itemSoldCount = Integer.parseInt(afterAt[1]);
System.out.println("itemSoldCount: " + itemSoldCount);
ShopJInternalFrame.shopHolderWAIType = new JLabel[itemSoldCount];
int i = 2;
for (int k = 0; k < itemSoldCount; k++){
String waiType = afterAt[i];
System.out.println("ShopJInternalFrame.shopHolderWAIType.length: " + ShopJInternalFrame.shopHolderWAIType.length);
System.out.println("waiType: " + waiType);
System.out.println("k: " + k);
ShopJInternalFrame.shopHolderWAIType[k].setText(waiType); //line 530
Here is my output:
itemSoldCount: 2
ShopJInternalFrame.shopHolderWAIType.length: 2
waiType: A
k: 0
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.jayavon.game.client.MyCommandReceiver$8.run(MyCommandReceiver.java:530)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
ShopJInternalFrame.shopHolderWAIType = new JLabel[itemSoldCount];
This allocates storage for the array, but not for any JLabel objects. The array contains all nulls at this point. When you reach
ShopJInternalFrame.shopHolderWAIType[k].setText(waiType);
shopHolderWAIType[k] is null.
ShopJInternalFrame.shopHolderWAIType[k] will be null because you have not allocated any memory for individual array member. So you need to do this before you use the array member.
ShopJInternalFrame.shopHolderWAIType[k] = new new JLabel();

Exception in thread error in Java

I'm trying to make a game with Java and in the game, the object that moves side ways called 'Pinko' is supposed to fire small objects called 'pellets' when the up or down arrow keys are pressed. It successfully compiles and runs, but every time I press the up or down arrow key, I get an error saying:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Pinko.move(Pinko.java:75)
at A2JPanel.actionPerformed(A2JPanel.java:102)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
There are seven classes: Application, Constants, JFrame, JPanel, Lovely, Pellet and Pinko.
My code in the move method in Pinko class looks like:
public void move(){
area.x -= speed;
if(area.x <= PINKO_MOVE_AREA_LHS || area.x >= PINKO_MOVE_AREA_RHS){
speed = -speed;
}
if( pelletsFired > 0 ){
for (int i = 0; i < pelletsFired; i++){
pellets[i].move();
}
}
}
And the ActionPerformed method in JPanel class looks like:
public void actionPerformed(ActionEvent e){
createLovely();
if(numberOfLovelies > 0){
for (int i = 0; i < numberOfLovelies; i++){
lovelies[i].move();
}
}
pinko.move();
repaint();
}
I have no idea why I keep getting the error mentioned above.
Is there something wrong with the for loop in the move() method in Pinko class??
Any help will be much appreciated...
I would bet the NullPointerException happens here:
pellets[i].move();
Have you tried verifying that:
The Array is initialized
The index referenced contains an instance of what I suppose will be your Pellet class
If you are using an IDE then try to use the debugger to help you understand what is going wrong in your code. Otherwise a few traces can help you debug and nail the problem : Here is the updated code you can try :
public void actionPerformed(ActionEvent e){
createLovely();
if(numberOfLovelies > 0){
for (int i = 0; i < numberOfLovelies; i++){
if(lovelies[i] != null )
lovelies[i].move();
else
System.out.println("ERROR: Null lovelies found at an index : " + i);
}
}
if(pinko != null)
pinko.move();
else {
System.out.println("OOPS pinko is null");
}
repaint();
}

Null pointer exception when access index of a DefaultListModel

I have a list:
JList characterList = new JList(characterListModel);
characterListModel = new DefaultListModel();
String myCharacters[]={"Dean Winchester","Sam Winchester",
"Bobby Singer","Castiel"};
for (String myCharacter : myCharacters) {
((DefaultListModel) characterList.getModel()).addElement(myCharacter);
}
And I've written a method, in a seperate class, to remove a character at a selected index:
public void removeCharacter() {
DefaultListModel characterListModel = ((PlayerContentPane) IViewManager.Util.getInstance()
.getMyContainerPane().getMyPlayerManagerPane().getContentPane())
.getCharacterListModel();
JList characterList = ((PlayerContentPane) IViewManager.Util.getInstance()
.getMyContainerPane().getMyPlayerManagerPane().getContentPane())
.getCharacterList();
int idx = characterList.getSelectedIndex(); //<---line 62
int size = characterListModel.getSize();
characterListModel.remove(idx);
if (size == 0) {
//do nothing
} else {
if (idx == characterListModel.getSize()) {
idx--;
}
characterList.setSelectedIndex(idx);
characterList.ensureIndexIsVisible(idx);
}
}
However when I run it with my button, I get this stack trace:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.detica.LarpDB.Controller.Controller.removeCharacter(Controller.java:62)
at com.detica.LarpDB.view.PlayerContentPane$3.actionPerformed(PlayerContentPane.java:94)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
A lot of the issues I've seen googling this, stem from the line: DefaultListModel characterListModel = ....
And the issue they have is that their creating a new instance of the object, now I''m only new to this whole Java thing, but this shouldn't be an issue with me, as I've not made anythign new, I've just been specific about which object this is.
Please could someone help me untangle myself?
Those 2 lines can create a lot of problems:
DefaultListModel characterListModel = ((PlayerContentPane) IViewManager.Util.getInstance()
.getMyContainerPane().getMyPlayerManagerPane().getContentPane())
.getCharacterListModel();
JList characterList = ((PlayerContentPane) IViewManager.Util.getInstance()
.getMyContainerPane().getMyPlayerManagerPane().getContentPane())
.getCharacterList();
If any of the chained methods return null (for whatever reason) the line will throw a NullPointerException.
I suggest you break them down in several lines and check the value of each call to see where you get the null from.
EDIT
Just realised that line 62 is int idx = characterList.getSelectedIndex();. It means that characterList is null.
If it's failing on the line that you indicated is line 62, then the only object referenced on that line, and therefore the only thing that could be null, is characterList. This implies that your getCharacterList function is returning null. (If the error was inside the getSelectedIndex function, then you would have another line in your stack trace.)
As you didn't post the getCharacterList function, I can't say much more. But you should take a look at that function and see under what circumstances it could return null.

Categories