Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / GUI / September 2004

Tip: Looking for answers? Try searching our database.

java.lang.NullPointerException

Thread view: 
Alessandro Mizzoni - 08 Sep 2004 14:18 GMT
When i clicked on the button "cancel" of the first JoptionPane in
Inizializza(), return this error:

java.lang.NullPointerException
       at QuadratoMagico.inizializza(QuadratoMagico.java:469)
       at QuadratoMagico.<init>(QuadratoMagico.java:41)
       at QuadratoTest.main(QuadratoTest.java:12)

I want that after i pressed the button "cancel" of JoptionPane the program
exit without any error.
thx!!!!.

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;

/**
*Un oggetto QuadratoMagico rappresenta un pannello grafico:
*Il pannello realizza un ambito grafico in cui ? possibile visualizzare una
griglia di interi
*scegliendo fra 5 tipi:
*- Matrice vuota
*- Matrice random
*- Matrice random 2
*- Quadrato magico
*- Quadrato magico incompleto
*/

public class QuadratoMagico extends JFrame  {
  /**dichiarazione della variabile dimensione della griglia */
  private static int  N;
  /**Variabili  array che conterrano i valori per la realizzazione della
griglia*/
  private int[][] ArrayVuoto;
  private int[][] ArrayRandom1;
  private int[][] ArrayRandom2;
  private int[][] ArrayPerfetto;
  private int[][] ArrayQuasiPerfetto;
  private int[][] mat;
  private JButton[][] jb;

  /**Inizializza i 3 pannelli che conterranno rispettivamente: Griglia,
Men? a tendina, Pulsante "verifica"*/
  private JPanel pannello = new JPanel();  // crea il nuovo oggetto Jpannel
  private JPanel pannello2= new JPanel();
  private JPanel pannello3= new JPanel();

  /**Inizializza il bottone "verifica" e il menu a tendina"scelta array"*/
  private JButton Verifica= new JButton("verifica");
  private JComboBox SceltaArray;

  /**Metodo che inizializza il programmma*/
public QuadratoMagico()
  {
    inizializza(); //Richiama il metodo per la inizializzazione degli array
in base al valore N inserito
    ArrayVuoto=MatriceVuota(); //assegna alla variabile ArrayVuoto il
valore di ritorno del metodo MatriceVuota
    ArrayRandom1=MatriceRandom();//assegna alla variabile ArrayVuoto il
valore di ritorno del metodo MatriceRandom
    ArrayRandom2=MatriceRandom();//assegna alla variabile ArrayVuoto il
valore di ritorno del metodo MatriceRandom
    ArrayPerfetto=MatricePerfetta();//assegna alla variabile ArrayVuoto il
valore di ritorno del metodo MatricePerfetta
    ArrayQuasiPerfetto=MatriceQuasiPerfetta();//assegna alla variabile
ArrayVuoto il valore di ritorno del metodo MatriceQuasiPerfetta

    /*Inserimento degli elementi nel men? a tendina*/
    SceltaArray=new JComboBox();    // crea il nuovo oggetto JComboBox
    SceltaArray.addItem("<seleziona>");  //inserisce i nuove elementi in
cascata
    SceltaArray.addItem("Matrice vuota");
    SceltaArray.addItem("Matrice Random");
    SceltaArray.addItem("Matrice Random 2");
    SceltaArray.addItem("Matrice con quadrato magico");
    SceltaArray.addItem("Matrice con quadrato magico incompleto");
    SceltaArray.setEditable(true);      //Metodo per visualizzare il men?
tendina in formato editabile
  SceltaArray.addActionListener(new ChoiceListener());  //Aggiunge un
ActionListener al men? a tendina che genera gli eventi
    Verifica.addMouseListener(new MouseInterceptor());//aggiunge un
mouseListener al pulsante

    pannello3.add(Verifica); // aggiunge al pannello3 il pulsante
    pannello2.add(SceltaArray); // aggiunge al pannello 2 il men? a tendina

    /*Assegna dimensioni e posizione all'interno del Jframe*/
    pannello3.setPreferredSize(new Dimension(120, 100));
    pannello2.setPreferredSize(new Dimension(120, 100));
    getContentPane().add(pannello2, BorderLayout.NORTH); //contiene il men?
a tendina
    getContentPane().add(pannello, BorderLayout.CENTER); //contiene la
futura griglia
    getContentPane().add(pannello3, BorderLayout.SOUTH); //contiene il
pulsante

  }

  /**Implementazione del ricevitore per le azioni del mouse rispettivo al
pulsante residente nella griglia*/

  private ActionListener buttonListener = new ActionListener()

  {
    public void actionPerformed(ActionEvent e)
    {
      JButton pressedButton = (JButton) e.getSource(); //Variabile pulsante
di appoggio per la risoluzione del metodo

      // Prende la riga e la colonna usufruendo del comando
getClientProperty e le memorizza negli indici row e col
      int riga = ((Integer)
pressedButton.getClientProperty("MAT_ROW")).intValue();
      int colonna = ((Integer)
pressedButton.getClientProperty("MAT_COL")).intValue();

      int valore = mat[riga][colonna]; //Memorizza il valore dell'array
degli indici riportati in una varibiale intera

      /*Richiama il metodo showInputDialog per l'inserimente di un nuovo
valore, e visualizza come intero di default il valore
       *dell'elemento della matrice che si sta per modificare, il valore
inserito sara memorizzato
       *nella variabile stringa input*/

      String input =  JOptionPane.showInputDialog(QuadratoMagico.this,
"Inserisci un nuovo valore:", Integer.toString(valore));

      if (input != null) //condizione utile per non permettere all'utente
di non cancellera il dialog
      {
        try
        {
          valore = Integer.parseInt(input.trim());   //assegnamo a "valore"
il contenuto in intero di input, privo di spazzi grazie al metodo  trim()

          /* per soddisfare la propriet? del quadrato magico il valore
inserito deve essere compreso tra 1 e NxN*/
          if (valore > 0 && valore < N*N)
          {
            mat[riga][colonna] = valore;   //se il valore ? compreso tra 1
e NxN assegnamo all'array il nuovo valore inserito dall'utente
            pressedButton.setText(Integer.toString(valore)); //cambiamo il
nome al pulsante con il nuovo valore inserito
          }
          else
          {
            throw new NumberFormatException(
              "value must be >= 0 and < " + N*N);
          }
        }
        catch (NumberFormatException ex)
        {
          /*se l'input non ? valido appare una messaggio di errore e
l'intero all'interno dell'array non verr? modificato*/
          JOptionPane.showMessageDialog(QuadratoMagico.this, "Valore
inserito: " + input + "\n" + ex.getMessage(),
            "hai inserito un valore non valido, inserire un intero",
JOptionPane.ERROR_MESSAGE);
        }
      }
    }
  };

  /**La classe MouseAdapter inplementa l'interfaccia MouseListener in modo
che tutti i metodi non facciano nulla
   *la classe MouseAdaptor viene estesa ereditando tutti i metodi e
sovrascrivendo solo il metodo necessario: mouseClicked*/

   public class MouseInterceptor extends MouseAdapter{
 public void mouseClicked(MouseEvent event) {
  if (verifica(mat))      //Se il metodo verifica() restituisce il valore
"true"..
              JOptionPane.showMessageDialog(QuadratoMagico.this,"? un
quadrato magico");     //il metodo showMessageDialog mostra il messaggio "?
un quadrato magico"
           else
              JOptionPane.showMessageDialog(QuadratoMagico.this,"non ? un
quadrato magico");   //il metodo showMessageDialog mostra il messaggio "non
? un quadrato magico"
  }

}

  /**Implementazione del ricevitore di eventi del men? a tendina
"SceltaArray"*/
  private class ChoiceListener implements ActionListener {

 public void actionPerformed(ActionEvent event) {

     /*la variabile stringa riceve la stringa dell'elemento selezionato nel
men? a tendina*/
     String SceltaCorrente=(String)SceltaArray.getSelectedItem();

     /*usiamo una serie di condizioni per assagnare all'array mat,
utilizzato dal metodo CreaPannello, il respettivo array*/
     if (SceltaCorrente=="Matrice vuota"){
         mat = ArrayVuoto;
         CreaPannello();
     }

     if (SceltaCorrente=="Matrice Random"){
         mat = ArrayRandom1;
         CreaPannello();
     }

     if (SceltaCorrente=="Matrice Random 2"){
         mat = ArrayRandom2;
         CreaPannello();
     }

     if (SceltaCorrente=="Matrice con quadrato magico"){
         mat = ArrayPerfetto;
         CreaPannello();
     }

     if (SceltaCorrente=="Matrice con quadrato magico incompleto"){
         mat = ArrayQuasiPerfetto;
         CreaPannello();
     }

   }
}

/** Metodo per creare un pannello in cui verr? visualizata la griglia di
pulsanti*/
public void CreaPannello(){

JButton pulsante; //dichiaro una variabile istanza di appoggio

pannello.invalidate();  //invalida il pannello
pannello.removeAll();   //rimuove il contenuto del pannello
pannello.setLayout(new GridLayout(N, N));  //imposta il Layout come griglia
di dimensione N x N
    for (int i = 0; i < N; i++)
      for (int j = 0; j < N; j++)
      {

       /*per visualizzare un pulsante con testo inesistente (nel caso che
l'elemento dell'array abbia un valore uguale a 0)
        *o un pulsante contenente come testo il valore dell'array (nel caso
che l'elemento dell'array abbia un valore diverso da 0)
        *? stata implementata una condizione su mat[i][j] che, se viene
soddisfatta, crea un pulsante privo di scritte e colorato
        *altrimenti un pulsante con all'interno il valore dell'array*/

        if (mat[i][j] == 0){
         pulsante = new JButton("");      //associa alla variabile pulsante
un nuovo oggetto JButton con stringa vuota
         pulsante.setBackground(Color.cyan); //imposta il colore al
pulsante
        }
        else{
         pulsante = new JButton(Integer.toString(mat[i][j])); //associa
alla variabile pulsante un nuovo oggetto Jbutton contenet il valore intero
dell'array mat
        }

        jb[i][j] = pulsante; //assegna all'array di pulsanti il pulsante
creato

        /*Per risolvere il problema dell'identificazione della posizione
pulsante all'interno della griglia, per cos?
         *associarlo alla esatta posizione del valore interno all'array
"mat" ci serviamo del metodo putClientProperty()
         *che ci permette di associare al pulsante il nome di una variabile
e il rispettivo valore.
         *In questo caso gli associamo a ogni pulsante due variabili:
         *PROP_MAT_ROW: che conterra un nuovo intero con indice i per le
righe.
         *PROP_MAT_COL: che conterra un nuovo intero con indice j per le
colonne*/

        pulsante.putClientProperty("MAT_ROW", new Integer(i));
        pulsante.putClientProperty("MAT_COL", new Integer(j));
        pulsante.addActionListener(buttonListener); //mettiamo il pulsante
in ascolto

        }

     /* al termine dell'inserimento dei pulsanti nell'array di pulsanti
"jb" procediamo all'aggiunta del contenuto di
      *jb all'interno del "pannello"*/
       for (int i = 0; i < jb.length; i++)
             for (int j = 0; j < N; j++)
                    pannello.add(jb[i][j]); //aggiunge pulsante nella
griglia

     pannello.repaint();   //ridisegna pannello
     pannello.validate();  //valida pannello
     }

   /**Metodo che restituisce una array di valori nulli.
    *@return :Array restituisce l'array*/
   public static int[][] MatriceVuota(){
    int[][] Array= new int[N][N]; //Variabile Array di appoggio
    for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
               Array[i][j] = 0;
        return Array;
    }

   /**Metodo che restituisce una array di valori random.
    *@return :Array restituisce l'array*/
    public static int[][] MatriceRandom(){
    int[][] Array= new int[N][N]; //Variabile array di appoggio
    int Res;

     for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++){
               /**il metodo random restituisce un valore casuale tra 0 e
N*N*/
               Res = (int)(Math.random()*(N*N));
               Array[i][j] = Res+1;
               }
        return Array;
       }

     /**Metodo che restituisce una array i cui valori costituiscono un
quadrato magico.
    *@return :Array restituisce l'array*/
    public static int[][] MatricePerfetta(){
          int[][] Array = new int[N][N]; //Variabile array di appoggio
          int i, j, k, l, chiave;

          for (i=0;i<N;i++)
              for (j=0;j<N;j++)
                Array[i][j] = 0;

           Array[0][(int)(N-1)/2] = 1;
           /* Costruzione del quadrato magico*/
           chiave = 2;
           i = 0;
           j = (int)(N-1)/2;
           while ( chiave <= N*N )
           {
              k = i - 1;

              if ( k < 0 )
                    k += N;

              l = j - 1;

              if ( l < 0 )
                    l += N;

              if ( Array[k][l] != 0 )
                          i = (i+1) % N;
              else {
                   i = k;
                   j = l;
                   }

              Array[i][j] = chiave;
              chiave++;
           }
        return Array;
      }

     /**Metodo che restituisce una array i cui valori costituiscono un
quadrato magico incompleto.
    *@return :Array restituisce l'array*/
   public static int[][] MatriceQuasiPerfetta(){
          int[][] Array = new int[N][N];
          int i, j, k, l, n, chiave, Pro;

           for (i=0;i<N;i++)
              for (j=0;j<N;j++)
                Array[i][j] = 0;

           Array[0][(int)(N-1)/2] = 1;
           /* Costruzione del quadrato magico*/
           chiave = 2;
           i = 0;
           j = (int)(N-1)/2;
           while ( chiave <= N*N )
           {
              k = i - 1;

              if ( k < 0 )
                    k += N;

              l = j - 1;

              if ( l < 0 )
                    l += N;

              if ( Array[k][l] != 0 )
                          i = (i+1) % N;
              else {
                   i = k;
                   j = l;
                   }

              Array[i][j] = chiave;
              chiave++;
           }

        for (i=0; i<N; i++)     //indica una posizione random all'interno
dell'array in cui inserire il valore zero
            Array[(int)(Math.random()*N)][(int)(Math.random()*N)]=0;

        return Array;
      }

   /**Metodo che verifica se i valori dell'array costituiscono un quadrato
magico
    *@param m array bidimensionale
    *@return qm :verifica booleana del quadrato magico*/
   public static boolean verifica(int[][] m) {
       boolean qm = true;      // variabile booleana per la verifica del
quadrato magico
       int somma = sommaRiga(m, 0);

       if (verificanumeri(m)>1)  // richiama il metodo verifica numeri, se
torna un valore che indica la presenza di 2 o piu numeri uguali
           qm = false;           // il quadro magico non ? valido

       if (somma!=sommaDiagonaleDestra(m)) //richiama il metodo che
verifica che la somma della diagonale da sinistra a destra sia guale a
"somma"
           qm = false;

       if (somma!=sommaDiagonaleSinistra(m)) //richiama il metode che
verifica che la somma della diagonale da destra a sinistra sia guale a
"somma"
             qm = false;

       for (int i=1; i<m.length; i++) {
           if (somma!=sommaRiga(m, i))   //richiama metodo sommaRiga per
verificare che la somma di tutte le righe di indice i sia uguale a "somma"
               qm = false;
           if (somma!=sommaColonna(m, i)) //richiama metodo sommaColonna
per verificare che la somma di tutte le colonne di indice i sia uguale a
"somma"
               qm = false;

       }

       return qm;
   }
   /**Metodo che restituisce la somma degli elementi della riga m
    *@param m array bidimensionale
    *@param rig indice riga
    *@return s :somma della riga*/
   public static int sommaRiga(int[][] m, int rig) {
       int s = 0;
       for (int j=0; j<m.length; j++)
           s+=m[rig][j];
       return s;
   }

   /**Metodo che restituisce la somma degli elementi della colonna m
    *@param m array bidimensionale
    *@param col indice colonna
    *@return s :somma della colonna*/
   public static int sommaColonna(int[][]m, int col) {
       int s = 0;
       for (int i=0; i<m.length; i++)
           s+=m[i][col];
       return s;

   }

   /**Metodo che restituisce la somma degli elementi della diagonale da
sinistra a destra
    *@param m array bidimensionale
    *@return s :somma della diagonale da sinistra a destra*/
   public static int sommaDiagonaleDestra(int[][]m) {
       int s = 0;
       for (int i=0; i<m.length; i++)
           s+=m[i][i];
       return s;

   }

   /**Metodo che restituisce la somma degli elementi della diagonale da
destra a sinistra
    *@param m array bidimensionale
    *@return s :somma della diagonale da destra a sinistra */
   public static int sommaDiagonaleSinistra(int[][]m) {
     int s = 0;
     int i = 0;

     for (int j=N-1; j>=0; j--){
        s+=m[i][j];
           i++;
      }

     return s;
   }

   /**Metodo che restituisce il numero numero massimo di elementi uguali
trovati all'interno dell'array
    *@param m array bidimensionale
    *@return test :elementi uguali all'interno dell'array */
   public static int verificanumeri(int[][] m){
    int test=0;

    /* facciamo rifermento a due coppie ordinate di indici per verificare
se all'interno dell'array vi sono
     * due o piu interi uguali.
     * Se cos? fosse deve uscire dal ciclo annidato e restituire il valore
"test" che sar? valutato dalla condizione
     * del metodo verifica(int[][]) */
    for (int i = 0; i < N; i++){
         for (int j = 0; j < N; j++){
             for (int k = 0; k < N; k++){
                 for (int l = 0; l < N; l++){
                  if ((m[i][j]==m[k][l])&&(test<2))
                      test++;
                  else
                      return test;
             }
             }

           test = 0;
           }
        }

        return test;

       }

     /**Implementazione del metodo per la inizializzazione della variabile
N che identificher? la grandezza della griglia
      *e delle variabili array*/

     public void inizializza(){
      String input;
      int test = 0;

      while ((test%2)==0){

        input =  JOptionPane.showInputDialog("Inserisci la dimensione della
griglia:"); //Assegna alla variabile input il valore inserito
              test = Integer.parseInt(input.trim()); //variabile di
appoggio a cui ? assegnato la variabile input convertita in intero
                                                 //il metodo trim()
restituisce una stringa priva di spazzi

             if (input != null){

                 try{
                    if ((test%2)!=0){            //se il valore della
variabile test ? dispari
                     N = test;                   //assegna il valore di
test alla variabile N
                     ArrayVuoto = new int[N][N];     //inizializza gli
array di interi con dimensione N
                      ArrayRandom1 = new int[N][N];
                      ArrayRandom2 = new int[N][N];
                      ArrayPerfetto = new int[N][N];
                      ArrayQuasiPerfetto = new int[N][N];
                      mat = new int[N][N];
                      jb = new JButton[N][N];        //inizializza gli
array di pulsanti con dimensione N
                 }
                else{
                 throw new NumberFormatException("il valore deve essere
dispari");
                }

                 }
              catch (NumberFormatException ex) {
                      JOptionPane.showMessageDialog(QuadratoMagico.this,"Valore
inserito: " + input + "\n" + ex.getMessage(),"hai inserito un valore non
valido,inserire un intero con valore dispari",JOptionPane.ERROR_MESSAGE);
                       }
       }

    }

    }
}
Andrew Thompson - 08 Sep 2004 14:49 GMT
> import java.awt.*;

20Kb of code, coming to just under 600 lines,
is far too much to post to a group and expect
free help.

Further, your line lengths are far too long,
your code example caused 54 compile errors
due to line wrap.

For tips on preparing example code for
others to see, check this document.
<http://www.physci.org/codes/sscce.jsp>

> I want that after i pressed the button "cancel" of JoptionPane the program
> exit without any error.

It should take no more than 50-100
(*short*) lines of code to reproduce
your error.

Signature

Andrew Thompson
http://www.PhySci.org/ Open-source software suite
http://www.PhySci.org/codes/ Web & IT Help
http://www.1point1C.org/ Science & Technology

Thomas A. Russ - 08 Sep 2004 18:16 GMT
> When i clicked on the button "cancel" of the first JoptionPane in
> Inizializza(), return this error:
[quoted text clipped - 7 lines]
> exit without any error.
> thx!!!!.

Your first step should be to look at line 469 of your Java program and
see what it is doing.  From the error message, it seems that you are
referencing some object that doesn't exist or some variable that has not
yet been initialized.

I think the problem is that you use the variable "input" before testing
if it is null.

Signature

Thomas A. Russ,  USC/Information Sciences Institute

Tor Iver Wilhelmsen - 09 Sep 2004 09:11 GMT
> java.lang.NullPointerException
>         at QuadratoMagico.inizializza(QuadratoMagico.java:469)

This says:

"On line 469 of the file QuadratoMagico.java there is at least one use
of the dot (.) operator. One of the references or return values in
front of such an operator has the value null."


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.