Torna indietro   Hardware Upgrade Forum > Software > Programmazione

PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-09-2008, 18:31   #1
Izmailov
Junior Member
 
L'Avatar di Izmailov
 
Iscritto dal: Jul 2006
Città: Emilia
Messaggi: 26
[Java] Problema grave!

Ho appena iniziato a studiare Java ed ho cercato di realizzare un piccolo programmino che crei un mazzo di carte mescolato in maniera diversa ogni volta! Però mi segnala sempre un errore in fase di esecuzione!

Vi posto il codice sperando possiate aiutarmi!

Quote:
La classe Partita semplicemente crea l'oggetto uno della classe Mazzo
Spoiler:
Codice:
public class Partita
{
    public static void main(String args[])
    {
        Mazzo uno = new Mazzo();
    }
}

Quote:
La classe Carta definisce come è fatta una carta da gioco come ad esempio "Cavallo di Bastoni"
Spoiler:
Codice:
public class Carta
{
    private int numero;
    private String seme;
    
    public Carta(int numero, String seme)
    {
        this.setCarta(numero, seme);
    }
    
    public void setCarta(int numero, String seme)
    {
        this.setNumero(numero);
        this.setSeme(seme);
    }
    
    public void setNumero(int numero)
    {
        this.numero = numero;
    }
    
    public void setSeme(String seme)
    {
        this.seme=seme;
    }
    
    public int getNumero()
    {
        return this.numero;
    }
    
    public String getSeme()
    {
        return this.seme;
    }
}

Quote:
La classe Mazzo invece crea una array di oggetti della classe Carta e in modo casuale crea le carte dell'array! Fino a qui a tutto funziona...fino a quando non cerco di fare in modo che le carte siano l'una diversa dall'altra facendo un controllo tra l'ultima carta creata e il resto dell'array.
Spoiler:
Codice:
public class Mazzo
{
    public Mazzo()
    {
        Carta[] carta = new Carta[40];
        
        for(int i=0; i<40; i=i+1)
        {
            int valoreSeme = (int)(Math.random()*4+1);
            int numero = (int)(Math.random()*10+1);
            String seme = new String();
            switch(valoreSeme)
            {
                case 1:
                    seme = "Spade";
                    break;
                case 2:
                    seme = "Denari";
                    break;
                case 3:
                    seme = "Coppe";
                    break;
                case 4:
                    seme = "Bastoni";
                    break;
            }
            //La prima carta va sicuramente bene
            if(i==0)
            carta[i] = new Carta(numero, seme);
            //Dalla seconda carta in poi ho fatto in modo che cerchi di      confrontare l'ultima carta generata in modo casuale con il resto dell'array. Se questa risulta diversa dalla prima, la variabile j aumenta altrimenti il ciclo for finisce. Se alla fine dell'ultimo confronto, la variabile j è uguale al numero delle carte dell'array allora vuol dire che la carta da confrontare è stata confrontata con tutte quelle dell'array ed è risultata sempre diversa, quindi viene aggiunta nell'array. A questo punto però mi dà l'errore. Dopo aver inserito una o due carte mi genera un errore!
            else if(i>0)
            {
                for(int j=1, k=0; k<i; k=k+1)
                {
                    if((numero!=carta[k].getNumero())&&(seme!=carta[k].getSeme()))
                    {
                        j=j+1;
                        if(j==i)
                        {
                            carta[i] = new Carta(numero, seme);
                        }
                    }
                 }
            }
            System.out.println(carta[i].getNumero() + " di " + carta[i].getSeme());
        }
    }
}


Quote:
Ed ecco infine l'errore!
Spoiler:
Codice:
1 di Denari
Exception in thread "main" java.lang.NullPointerException
    at Mazzo.<init>(Mazzo.java:34)
    at Partita.main(Partita.java:5)

Process Terminated... there were problems.
__________________
Izmailov è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 18:54   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Codice:
for(int i=0; i<40; i=i+1)
{
    int valoreSeme = (int)(Math.random()*4+1);
    int numero = (int)(Math.random()*10+1);
    String seme = new String();
    switch(valoreSeme)
    {
          //...
    }
            
    //La prima carta va sicuramente bene
    if(i==0)
        carta[i] = new Carta(numero, seme);
    else if(i>0)
    {
        for(int j=1, k=0; k<i; k=k+1)
        {
             if((numero!=carta[k].getNumero())&&(seme!=carta[k].getSeme()))
             {
                  j=j+1;
                  if(j==i)
                  {
                      carta[i] = new Carta(numero, seme);
                  }
             }
         }
     }
     System.out.println(carta[i].getNumero() + " di " + carta[i].getSeme());
}
Hai un NullPointerException per forza: il ciclo for principale che deve generare le 40 carte vede il suo percorso di esecuzione diviso in due flussi da un if-else.

Nel primo if (if (i==0), l'iterazione della prima carta) la carta viene sicuramente creata (si arriva ad un new "Carta(numero, seme)"), se invece l'if non viene verificato (dalla seconda iterazione in poi) nel corpo dell'else non è detto ceh si arrivi ad allocare una carta [vedi blocchi evidenziati in grassetto]

dato che il System.out.printl() lo fai dentro il ciclo for subito dopo l'if-else, dalla seconda iterazione in poi la carta potrebbe non essere stata creata (nessuna chiamata a new Carta(...), quindi ti ritrovi una reference che punta a null).

Inoltre mi sembra che la condizione di verifica sia semanticamente errata:
Codice:
if (  (numero!=carta[k].getNumero())  &&  (seme!=carta[k].getSeme())  )
Controlli che la nouva "carta random" sia diversia sia per numero che per seme, invece basta che sia diversa per numero oppure per seme.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 19:02   #3
Izmailov
Junior Member
 
L'Avatar di Izmailov
 
Iscritto dal: Jul 2006
Città: Emilia
Messaggi: 26
Sei un genio! E poi anche io sono impedito!

Grazie mille!
__________________
Izmailov è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 19:07   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Solo un consiglio: per questioni di chiarezza nella lettura del codice è bene esplicitare sempre le parentesi graffe nei costrutti if, if-else, e ancora più negli if-else if a catena.
E anche nei for/while che hanno una sola riga di istruzioni.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 19:10   #5
Izmailov
Junior Member
 
L'Avatar di Izmailov
 
Iscritto dal: Jul 2006
Città: Emilia
Messaggi: 26
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Solo un consiglio: per questioni di chiarezza nella lettura del codice è bene esplicitare sempre le parentesi graffe nei costrutti if, if-else, e ancora più negli if-else if a catena.
E anche nei for/while che hanno una sola riga di istruzioni.
D'accordo! Sei davvero gentile!
__________________
Izmailov è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 21:21   #6
dupa
Senior Member
 
L'Avatar di dupa
 
Iscritto dal: Jan 2002
Città: Napoli
Messaggi: 1727
http://java.sun.com/j2se/1.4.2/docs/...java.util.List)
__________________
Se buttassimo in un cestino tutto ciò che in Italia non funziona cosa rimarrebbe? Il cestino.
dupa è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 09:35   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Un altro modo in effetti sarebbe quello di generare il mazzo di carte con due cicli for: il primo cicla per seme, il secondo, annidato nel primo, per valore della carta.

Per memorizzare le carte potresti usare un ArrayList invece di un semplice array, in questo modo puoi usare il comodo metodo shuffle() della classe Collections [java.util.Collections.shuffle(aList)] che prende come parametro una List e ne mescola gli elementi.

Ad esempio:
Codice:
import java.util.Collection;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;

// ...

ArrayList listCarte = new ArrayList();    // il mazzo, ancora vuoto

// genera il mazzo ordinato per seme e valore
for (int seme = 1;  i <= 4;  seme++)
{
    for (int valore = 1;  valore <= 10;  valore++)
    {
         listCarte.add(new Carta(valore, seme));
    }
}

// mescola il mazzo
Collections.shuffle(listCarte);

//...
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 10:00   #8
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Voto per l'ultima impostazione di Baynru, anche se la condirei ulteriormente con una classe "Mazzo" che circondi e nasconda la lista.
E che abbia almeno il metodo Shuffle.
In piu', proprio per la natura di questi problemi, al posto di un normale Lista metterei (se c'e' in Java) una Coda o Stack, in modo tale da esporre la Dequeue, per scodare, quando serve, una carta per volta.
Proprio come quando si pesca o si distribuiscono le carte...
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 10:20   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
In piu', proprio per la natura di questi problemi, al posto di un normale Lista metterei (se c'e' in Java) una Coda o Stack, in modo tale da esporre la Dequeue, per scodare, quando serve, una carta per volta.
Proprio come quando si pesca o si distribuiscono le carte...
Nel Collection Framework di Java c'è una interface: Queue, implementata (tra le varie possibilità) dalla classe LinkedList.

Alcune informazioni in merito.
Codice:
The Queue Interface

    A Queue is a collection for holding elements prior to processing. Besides 
basic Collection operations, queues provide additional insertion, removal, 
and inspection operations. The Queue interface follows.

        public interface Queue<E> extends Collection<E> {
            E element();
            boolean offer(E e);
            E peek();
            E poll();
            E remove();
        }

    Each Queue method exists in two forms: (1) one throws an exception 
if the operation fails, and (2) the other returns a special value if the 
operation fails (either null or false, depending on the operation). 
The regular structure of the interface is illustrated in the following table.
    Queue Interface Structure    Throws exception    Returns special value
    Insert 	                    add(e) 	       offer(e)
    Remove 	                    remove() 	       poll()
    Examine 	                    element() 	       peek()

    Queues typically, but not necessarily, order elements in a FIFO 
(first-in-first-out) manner. Among the exceptions are priority queues, 
which order elements according to their values — see the Object 
Ordering section for details). Whatever ordering is used, the head 
of the queue is the element that would be removed by a call to remove 
or poll. In a FIFO queue, all new elements are inserted at the tail of 
the queue. Other kinds of queues may use different placement rules. 
Every Queue implementation must specify its ordering properties. 

Link
Quote:
Queue Implementations

The Queue implementations are grouped into general-purpose and concurrent implementations.
General-Purpose Queue Implementations
As mentioned in the previous section, LinkedList implements the Queue interface, providing FIFO queue operations for add, poll, and so on.

The PriorityQueue class is a priority queue based on the heap data structure. This queue orders elements according to an order specified at construction time, which can be the elements' natural ordering or the ordering imposed by an explicit Comparator.

The queue retrieval operations — poll, remove, peek, and element — access the element at the head of the queue. The head of the queue is the least element with respect to the specified ordering. If multiple elements are tied for least value, the head is one of those elements; ties are broken arbitrarily.

PriorityQueue and its iterator implement all of the optional methods of the Collection and Iterator interfaces. The iterator provided in method iterator is not guaranteed to traverse the elements of the PriorityQueue in any particular order. If you need ordered traversal, consider using Arrays.sort(pq.toArray()).

Link
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 23-09-2008 alle 10:25.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 10:37   #10
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Perfetta direi
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 10:47   #11
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Già che ci siamo, posto anche questo (circa ArrayList e LinkedList):
Quote:
List Implementations

List implementations are grouped into general-purpose and special-purpose implementations.
General-Purpose List Implementations
There are two general-purpose List implementations — ArrayList and LinkedList. Most of the time, you'll probably use ArrayList, which offers constant-time positional access and is just plain fast. It does not have to allocate a node object for each element in the List, and it can take advantage of System.arraycopy when it has to move multiple elements at the same time. Think of ArrayList as Vector without the synchronization overhead.

If you frequently add elements to the beginning of the List or iterate over the List to delete elements from its interior, you should consider using LinkedList. These operations require constant-time in a LinkedList and linear-time in an ArrayList. But you pay a big price in performance. Positional access requires linear-time in a LinkedList and constant-time in an ArrayList. Furthermore, the constant factor for LinkedList is much worse. If you think you want to use a LinkedList, measure the performance of your application with both LinkedList and ArrayList before making your choice; ArrayList is usually faster.

ArrayList has one tuning parameter — the initial capacity, which refers to the number of elements the ArrayList can hold before it has to grow. LinkedList has no tuning parameters and seven optional operations, one of which is clone. The other six are addFirst, getFirst, removeFirst, addLast, getLast, and removeLast. LinkedList also implements the Queue interface.

Link
Visto che rimuovere una carta da sopra il mazzo (ed evenetualmente reinserirla nel fondo del mazzo) non richiede un accesso posizionale si potrebbe usare LinkedList al posto del più comune ArrayList, però la collezione di carte è piccola (appena 40 elementi) e la parte in grassetto circa i fattori costanti svantaggiosi potrebbe avere il suo peso, in un caso come questo (non resterebbe che provare con entrambe).
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 23-09-2008 alle 10:52.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
OnePlus Nord 6 sta arrivando e avr&agrav...
CPU desktop: Intel dice addio ai socket ...
Google sta testando un'app di Gemini per...
NVIDIA GeForce RTX 5070 Laptop: in arriv...
Il Tribunale di Roma ha annullato la mul...
AppleCare One potrebbe arrivare presto i...
Amazon ci riproverà: l'azienda st...
Apple e Samsung dominano la classifica d...
Un game designer di 9 anni, due fogli a ...
Il weekend Amazon parte col botto: gross...
Amazfit Active 2 scende a 69,99€: i migl...
Smart TV No IVA su Amazon: QLED, Mini-LE...
C'è un TV OLED da 65'' a 900€, ma anche ...
Non solo smartphone: OnePlus sta per lan...
DJI Mavic 4 Pro in super offerta su Amaz...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:35.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v