CodeGym /Corsi /JAVA 25 SELF /Errori nella dichiarazione di classi e oggetti

Errori nella dichiarazione di classi e oggetti

JAVA 25 SELF
Livello 23 , Lezione 0
Disponibile

1. Errori nella dichiarazione della classe

Assenza dei modificatori di accesso (package-private per impostazione predefinita)

In Java, se non specifichi esplicitamente un modificatore di accesso per una classe, essa diventa accessibile solo all’interno del pacchetto corrente. Questo si chiama package-private o “accesso predefinito”. Per esempio:

// File Book.java
class Book {
    String title;
}

Una classe del genere non può essere usata da un altro pacchetto. Se vuoi che la classe sia accessibile ovunque (e spesso è proprio ciò che serve per i modelli principali), usa il modificatore public:

public class Book {
    String title;
}

Perché è importante?
Se ti dimentichi di mettere public, potresti chiederti a lungo perché una certa Library di un altro pacchetto non vede la tua classe.

Incoerenza tra nome della classe e nome del file

In Java il nome del file che contiene una classe deve coincidere con il nome della classe public all’interno di quel file (attenzione alle maiuscole/minuscole!). Per esempio:

// File Book.java
public class Book {
    // ...
}

Se chiami il file book.java (con l’iniziale minuscola) o, peggio ancora, BooK.java, il compilatore restituirà un errore. È uno dei motivi per cui l’IDE “si arrabbia” quando rinomini una classe ma ti dimentichi di rinominare il file.

Errori nella sintassi della dichiarazione: parentesi graffe mancanti, posizionamento errato di metodi e campi

Java è un linguaggio rigoroso. Se dimentichi una parentesi graffa o dichiari accidentalmente un metodo dentro un altro metodo (non si può!), il compilatore te lo segnalerà immediatamente.

Esempio di dichiarazione errata:

public class User
    String name; // Ops! Mancano le parentesi graffe della classe

    public void printName() {
        System.out.println(name);
    }
}

Versione corretta:

public class User {
    String name;

    public void printName() {
        System.out.println(name);
    }
}

Ricordate:

  • Tutti i campi e i metodi si dichiarano solo all’interno delle parentesi graffe della classe.
  • I metodi non possono essere annidati l’uno dentro l’altro (in alcuni linguaggi è consentito, ma non in Java!).

2. Errori nella creazione degli oggetti

Tentativo di usare un oggetto prima della sua inizializzazione (NullPointerException)

L’errore più comune di sempre è provare ad accedere a un oggetto che non è ancora stato creato. In Java le variabili di tipo riferimento sono per impostazione predefinita uguali a null.

Esempio:

User user;
System.out.println(user.name); // NullPointerException!

Perché?
La variabile user è dichiarata ma non inizializzata. Se provi ad accedere a un campo o a un metodo, otterrai una NPE (NullPointerException).

Approccio corretto:

User user = new User();
System.out.println(user.name); // Ora va tutto bene (se il campo non è null)

Errori nella chiamata del costruttore (parametri non corrispondenti, assenza del costruttore predefinito)

Se una classe ha solo un costruttore con parametri, tentare di creare un oggetto senza parametri porterà a un errore di compilazione.

public class Book {
    String title;

    public Book(String title) {
        this.title = title;
    }
}

Book book = new Book(); // Errore! Non esiste un costruttore senza parametri

Soluzione: aggiungi un costruttore senza parametri oppure passa sempre i valori necessari:

Book book = new Book("Java per principianti");

Creazione multipla di oggetti invece di riutilizzarli

A volte i principianti creano un nuovo oggetto ogni volta che devono accedervi, invece di usare quello già creato.

Book book = new Book("Java per principianti");
System.out.println(book.title);

book = new Book("Java per principianti"); // Perché? Esisteva già un oggetto uguale!
System.out.println(book.title);

Non è un errore di compilazione, ma è un cattivo stile: perdi il riferimento al vecchio oggetto e sprechi memoria.

3. Best practice: come evitare le trappole

Indicate sempre esplicitamente i modificatori di accesso

Non abbiate paura di scrivere public, private o protected — non è solo una questione di sicurezza, ma anche di leggibilità del codice. L’IDE ovviamente ti aiuterà, ma è meglio creare subito la buona abitudine.

Esempio:

public class User {
    private String name;
    // ...
}

Fate attenzione alla denominazione delle classi

  • Il nome della classe — con iniziale maiuscola, stile CamelCase: Book, LibraryUser, BookManager.
  • Il nome del file — esattamente come il nome della classe.

Usate i costruttori per inizializzare i campi obbligatori

Se un oggetto ha campi che devono essere valorizzati alla creazione, aggiungi un costruttore con parametri. Questo ti protegge da errori in fase d’uso.

Esempio:

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }
}

Ora non si può creare User senza nome — il compilatore non lo permetterà.

4. Mettiamo in pratica: costruiamo una mini‑applicazione «Biblioteca»

Continuiamo a sviluppare la nostra applicazione didattica. Supponiamo di avere una classe Book e una classe Library, che gestisce i libri.

Esempio di dichiarazione corretta di una classe

// File Book.java
public class Book {
    private String title;
    private String author;

    // Costruttore con parametri
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    // Getter
    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }
}

Esempio di creazione corretta di un oggetto

Book book = new Book("Java per principianti", "John Doe");
System.out.println(book.getTitle() + " - " + book.getAuthor());

Esempio di classe manager

// File Library.java
import java.util.ArrayList;

public class Library {
    private ArrayList<Book> books = new ArrayList<>();

    public void addBook(Book book) {
        books.add(book);
    }

    public void printAllBooks() {
        for (Book book : books) {
            System.out.println(book.getTitle() + " - " + book.getAuthor());
        }
    }
}

Utilizzo in main

public class Main {
    public static void main(String[] args) {
        Library library = new Library();
        Book book1 = new Book("Java per principianti", "John Doe");
        Book book2 = new Book("OOP in parole semplici", "Ivan Ivanov");

        library.addBook(book1);
        library.addBook(book2);

        library.printAllBooks();
    }
}

5. Illustrazioni e schemi

Schema: dove dichiarare cosa?

+-----------------------------+
|         Book.java           |
|-----------------------------|
| public class Book {         |
|     private String title;   |  <--- campi (solo all'interno della classe)
|     ...                     |
|     public Book(...) {...}  |  <--- costruttore (dentro la classe)
|     public String getTitle()|  <--- metodi (dentro la classe)
| }                           |
+-----------------------------+

+-----------------------------+
|        Main.java            |
|-----------------------------|
| public class Main {         |
|     public static void main |
|         // Creazione degli oggetti|
|         Book book = new Book|
| }                           |
+-----------------------------+

6. Analisi degli errori tipici

Errore 1: Incoerenza tra nome della classe e del file

// File: Libraryuser.java
public class LibraryUser { // Nome della classe con U maiuscola, file con minuscola!
    // ...
}

class LibraryUser is public, should be declared in a file named LibraryUser.java

Errore 2: Tentativo di utilizzare un oggetto non inizializzato

Book book;
System.out.println(book.getTitle()); // NullPointerException!

Errore 3: Dimenticate le parentesi graffe

public class Book
    private String title; // I campi di solito si rendono private per l'incapsulamento
    // ...
}

';' expected

Errore 4: Dichiarazione di un metodo dentro un altro metodo

public class User {
    public void printName() {
        void sayHello() {
            System.out.println("Hello!"); // Non si può dichiarare un metodo dentro un altro metodo!
        }
    }
}

illegal start of type

1
Compito
JAVA 25 SELF, livello 23, lezione 0
Bloccato
Progettazione del database degli studenti 📚
Progettazione del database degli studenti 📚
1
Compito
JAVA 25 SELF, livello 23, lezione 0
Bloccato
Il pericolo dei libri "vuoti" nel catalogo della biblioteca 👻
Il pericolo dei libri "vuoti" nel catalogo della biblioteca 👻
1
Compito
JAVA 25 SELF, livello 23, lezione 0
Bloccato
Metodo dentro un metodo: Divieto architetturale 🏗️
Metodo dentro un metodo: Divieto architetturale 🏗️
1
Compito
JAVA 25 SELF, livello 23, lezione 0
Bloccato
Denominazione obbligatoria del nuovo prodotto 🏷️
Denominazione obbligatoria del nuovo prodotto 🏷️
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION