Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327

    Non riesco a istanziare un oggetto della classe NetworkInterface

    Salve ragazzi!
    Come da titolo, non riesco a istanziare un oggetto della classe NetworkInterface, nella fattispecie obj, che mi serve per poter chiamare il metodo getDisplayName().
    Il messaggio d'errore è Cannot find Symbol.

    Ecco il codice:
    codice:
    package interfaccia1;
    import java.net.*;
    import java.util.*;
    
    public class Interfaccia1 {
    
        
        public static void main(String[] args)throws Exception {
            NetworkInterface obj = new NetworkInterface();
            String a=obj.getDisplayName();
        }
    }
    Grazie in anticipo a chiunque voglia aiutarmi!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: Non riesco a istanziare un oggetto della classe NetworkInterface

    Originariamente inviato da playbasfa
    Il messaggio d'errore è Cannot find Symbol.
    Il messaggio d'errore è ben più lungo, articolato e preciso di quanto tu abbia riportato. Ricordati che se vuoi ottenere delle risposte utili devi essere tu a fornire sempre quanti più dettagli possibili e, soprattutto, a non tralasciare informazioni importanti.

    Cannot find symbol, da solo non aiuta gran ché... il messaggio specifica anche quale symbol non è stato trovato (pensa un po' se avessi scritto un programma con un centinaio di righe e un centinaio di variabili... quale sarà mai quella che non trova?) e la riga dove tu l'hai usato.

    In buona sostanza il simbolo che tu hai usato e che non esiste è il costruttore vuoto (prova un po' a guardare la documentazione e ti accorgerai che non ne esiste nessuno).

    Gli unici tre modi per "istanziare" un NetworkInterface sono:

    1) Usare il metodo statico getByInetAddress(InetAddress ia);
    2) Usare il metodo statico getByName(String name);
    3) Usare il metodo statico getNetworkInterfaces() che restituisce una enumerazione di NetWorkInterface.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Anzitutto grazie per la risposta.
    Hai ragione non ho posto la domanda in maniera corretta.
    La documentazione che mi hai mandato l'avevo già sotto mano ma da quella non riesco assolutamente ad evincere che non esiste il costruttore vuoto. Potresti spiegarmi per favore come fare a capirlo?

    Ciò che sono andato a guardare io è il codice qui di seguito nel quale io vedo la presenza del costruttore vuoto.

    codice:
    /*
     * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
     * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
    
    package java.net;
    
    import java.util.Enumeration;
    import java.util.NoSuchElementException;
    import sun.security.action.*;
    import java.security.AccessController;
    
    /**
     * This class represents a Network Interface made up of a name,
     * and a list of IP addresses assigned to this interface.
     * It is used to identify the local interface on which a multicast group
     * is joined.
     *
     * Interfaces are normally known by names such as "le0".
     *
     * @since 1.4
     */
    public final class NetworkInterface {
        private String name;
        private String displayName;
        private int index;
        private InetAddress addrs[];
        private InterfaceAddress bindings[];
        private NetworkInterface childs[];
        private NetworkInterface parent = null;
        private boolean virtual = false;
    
        static {
            AccessController.doPrivileged(new LoadLibraryAction("net"));
            init();
        }
    
        /**
         * Returns an NetworkInterface object with index set to 0 and name to null.
         * Setting such an interface on a MulticastSocket will cause the
         * kernel to choose one interface for sending multicast packets.
         *
         */
        NetworkInterface() {
        }
    
        NetworkInterface(String name, int index, InetAddress[] addrs) {
            this.name = name;
            this.index = index;
            this.addrs = addrs;
        }
    Grazie in anticipo per l'aiuto.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    la documentazione non riporta costruttori (di solito elencati nella sezione construction summary

    In questo caso è stato esplicitamente dichiarato private il costruttore e l'unico modo sicuro per istanziare la classe è usare i metodi che ti ha dato Leleft
    RTFM Read That F*** Manual!!!

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il pezzo di codice che hai riportato (parte del sorgente della classe) evidenzia che vi sono 2 costruttori per la classe, ma nessuno di quelli è pubblico (sarebbero marcati come "public") o protetto ("protected"). Di conseguenza, non sono utilizzabili dal mondo esterno, ma solamente dalle classi che fanno parte dello stesso package (documentati sulle regole di visibilità indotte dai modificatori di accesso: http://docs.oracle.com/javase/tutori...sscontrol.html).

    Quello che un programmatore deve fare quando programma non è andarsi a vedere i sorgenti delle classi (lo può fare per diletto personale o per altri motivi), ma deve usare la documentazione ufficiale (quella che ho linkato io). Soprattutto per chi come te (o, almeno a me sembra, potrei sbagliarmi) sta iniziando a studiare e non ha la piena padronanza di tutti gli aspetti del linguaggio (vedi, appunto, i modificatori di accesso): in quel modo rischi solo di fare confusione e prendere grossi abbagli.

    Prova a confrontare la documentazione di queste due classi:
    NetworkInterface
    Integer (l'ho presa a caso).

    Noterai, guardando la documentazione, che la classe Integer ha delle sezioni in più rispetto alla classe NetworkInterface... e se dai un'occhiata anche ad altre classi, noterai che sono di più le classi con una struttura di documentazione "simile" a Integer, che non a NetworkInterface.

    La classe Integer, infatti, ha le seguenti sezioni:

    Field Summary
    Constructor Summary
    Method Summary


    La prima è una sezione in cui vengono elencati tutti i campi pubblici o protected della classe.
    La seconda è una sezione dove vengono elencati tutti i costruttori pubblici o protected della classe.
    La terza è una sezione dove vengono elencati tutti i metodi pubblici o protected della classe.

    Se una classe non ha alcuna sezione relativa ai costruttori, significa che può essere istanziata solo attraverso metodi statici o classi Factory oppure può essere istanziata solo da altre classi e non dal programmatore.

    Questa è solo una prima infarinatura e una linea guida stringatissima sul come si consulta la documentazione... per il momento ti inviterei a lasciar perdere i sorgenti delle classi del core.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Premesso che hai centrato in pieno circa le mie competenze.
    Non potevo sperare in una risposta migliore, era proprio ciò che volevo sapere, ti ringrazio infinitamente.
    Adesso capisco anche perchè mi hai detto che l' unico modo "per istanziare una NetworkInterface" è quella di usare uno di quei 3 metodi citati sopra, perchè sono static no?

    Anche se non comprendo a pieno questa frase, io la vedo più come (sbagliando ovviamente):
    Gli unici 3 metodi che puoi usare sono quelli static dal momento che per usare gli altri avresti bisogno di istanziare un oggetto, ma a causa della mancanza di costruttori non è possibile istanziare alcun oggetto! Per tanto gli unici metodi che puoi usare sono quelli dichiarati static!

    Ovviamente è sbagliato ciò che dico, gli altri metodi devono essere adoperabili altrimenti non sarebbero stati presenti nella documentazione.
    Mi manca un pezzo credo che la risposta sia celata nella parte della tua risposta che non mi è chiara: l' unico modo "per istanziare una NetworkInterface" .

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Cerchiamo di fare un po' più di luce.

    La differenza fra metodi statici e non statici mi pare tu l'abbia afferrata: i metodi non statici agiscono (e possono, quindi, essere invocati) solo su istanze di quella particolare classe, mentre i metodi statici non necessitano di alcuna istanza, poichè possono essere invocati direttamente con il nome della classe.

    Il fatto che un metodo sia statico non configura nessuna particolarità, se non il fatto che possa essere invocato direttamente con il nome della classe, senza alcuna istanza presente. Esempio:

    codice:
    // Ottengo un numero casuale compreso fra 0 e 1
    double casuale = Math.random();
    Il metodo random() è statico, non serve quindi che io istanzi un oggetto della classe Math per poterlo usare... ma il fatto che sia statico non mi dice nulla se non questo. Non si configura un ruolo particolare di quel metodo, se non quello per cui è stato scritto: fornire un numero casuale.

    Andiamo oltre.
    Cosa significa "istanziare un oggetto"? Significa ottenere, appunto, un'istanza precisa di un determinato tipo.

    La classe Integer rappresenta un numero intero. Istanziare un Integer significa creare un oggetto di tale classe, che rappresenta un particolare numero intero:

    codice:
    Integer pippo = new Integer( 5 );   // Istanzio un oggetto Integer che rappresenta il numero 5
    Integer pluto = new Integer( -2 );   // Istanzio un oggetto Integer che rappresenta il numero -2
    Ho creato due istanze della classe Integer: pippo e pluto.

    Cosa vuol dire istanziare una NetworkInterface? Quello che stavi cercando di fare tu... ovvero, ottenere un oggetto di tale classe (per farne cosa, non lo so). Come posso fare, se la classe non possiede costruttori pubblici? Devo controllare fra i suoi metodi statici se ce ne sono alcuni che mi restituiscono un oggetto di tipo NetworkInterface... e controllando la lista dei metodi della classe, si scopre che vi sono solo quei tre lì.

    Detto questo, non avevi detto affatto una cosa sbagliata... magari ti mancava un appiglio, ma il succo è proprio quello. Se non ci sono costruttori, gli unici modi per ottenere un oggetto di una determinata classe sono solo 2:

    1) Un metodo static che restituisca un'istanza di tale classe
    2) L'esistenza di una classe diversa (chiamata "Factory") che possieda un metodo (probabilmente statico, ma non necessariamente) che restituisca un'istanza di quell'oggetto.

    Un esempio di classe Factory è la classe BorderFactory che permette di ottenere istanze della classe Border (che non è istanziabile altrimenti).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Ca**o quanto sei stato chiaro!!!!! Ti faccio davvero i complimenti!!!
    Ti ringrazio per tutto l'aiuto!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.