View Full Version : [C#]Riferimento a un oggetto non impostato su un'istanza di oggetto.
Mattyfog
31-03-2010, 22:20
Ottengo questo errore (Riferimento a un oggetto non impostato su un'istanza di oggetto.) nel seguente codice. Eppure ho scritto TagLib.Tag[] tag = new TagLib.Tag[risultati_gracenote.Elements().Count()]; Che cosa non ho capito? (in grassetto ecco la parte che mi da errore, anche se suppongo che anche le altre 2 righe dopo lo darebbero :))
TagLib.Tag[] tag = new TagLib.Tag[risultati_gracenote.Elements().Count()];
Console.WriteLine("Indice array è uguale a " + risultati_gracenote.Elements().Count());
for (int a = 1; a <= risultati_gracenote.Elements().Count(); a++)
{
Console.WriteLine("a è uguale a " + a);
Console.WriteLine("titolo: " + risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Element("ul").Value);
Console.WriteLine("artisti: " + risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Elements().ElementAt(3).Value);
Console.WriteLine("album: " + risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Elements().ElementAt(5).Value);
tag[a].Title = risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Element("ul").Value;
tag[a].Performers[0] = risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Elements().ElementAt(3).Value;
tag[a].Album = risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Elements().ElementAt(5).Value;
}
Grazie a tutti!
Ottengo questo errore (Riferimento a un oggetto non impostato su un'istanza di oggetto.) nel seguente codice. Eppure ho scritto TagLib.Tag[] tag = new TagLib.Tag[risultati_gracenote.Elements().Count()]; Che cosa non ho capito? (in grassetto ecco la parte che mi da errore, anche se suppongo che anche le altre 2 righe dopo lo darebbero :))
TagLib.Tag[] tag = new TagLib.Tag[risultati_gracenote.Elements().Count()];
Console.WriteLine("Indice array è uguale a " + risultati_gracenote.Elements().Count());
for (int a = 1; a <= risultati_gracenote.Elements().Count(); a++)
{
Console.WriteLine("a è uguale a " + a);
Console.WriteLine("titolo: " + risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Element("ul").Value);
Console.WriteLine("artisti: " + risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Elements().ElementAt(3).Value);
Console.WriteLine("album: " + risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Elements().ElementAt(5).Value);
tag[a].Title = risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Element("ul").Value;
tag[a].Performers[0] = risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Elements().ElementAt(3).Value;
tag[a].Album = risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Elements().ElementAt(5).Value;
}
Grazie a tutti!
Da come hai scritto il ciclo for immagino che tu non sappia che il primo elemento ha indice 0.
Il for dovrebbe infatti partire da 0.
Quindi, immagino, quello che e'
risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1)
vorrebbe esssere forse
risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(0)
Comunque ti consiglio di prendere i vari riferimenti, che tanto non costano assolutamente nulla e vengono risolti infase di compilazione.
qualcosa come
var elementi = gracenote.Elements()
var elemento = elementi[a];
var sottoelementi = elemento.Elements();
var sottoelemeno = sottoelementi[0];
etc.
Cosi' quando ti ritrovi questo errore puoi risalire a quale e' l'elemento nullo.
Comunque, almeno il primo riferimento lo puoi ottenere ciclando direttamente sul primo elements(), che immagino implementi IEnumerable
foreach(var elemento in gracenote.Elements())
{
etc.
}
Mattyfog
31-03-2010, 23:11
Lo sapevo ma non pensavo fosse un problema se partisse da uno.. Quindi invece lo è?
Lo sapevo ma non pensavo fosse un problema se partisse da uno.. Quindi invece lo è?
Quando scrivi
risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1)
se per esempio l'ultima collezione avesse 0 oppure 1 elemento solo, cercando di accedere tu al secondo elemento (che e' quello con indice 1), sollevi un'eccezione.
astorcas
01-04-2010, 00:24
credo che il problema sia che l'array è pieno di puntatori nulli.
L'operatore new sull'array non instanzia automaticamente tutti gli oggetti che contiene, quindi
Tag[a].Title = risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Element("ul").Value;
genera una NullRreferenceException perché tag[a] è null
Uno dei tanti errori possibili.
PRocedendo prendendo i riferimenti, passo dopo passo, puoi mettere delle guard e notificare di conseguenza invece che lasciare sollevare l'eccezione.
Mattyfog
01-04-2010, 10:11
Quando scrivi
risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1)
se per esempio l'ultima collezione avesse 0 oppure 1 elemento solo, cercando di accedere tu al secondo elemento (che e' quello con indice 1), sollevi un'eccezione.
questa opzione la scarterei subito
credo che il problema sia che l'array è pieno di puntatori nulli.
L'operatore new sull'array non instanzia automaticamente tutti gli oggetti che contiene, quindi
Tag[a].Title = risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1).Element("ul").Value;
genera una NullRreferenceException perché tag[a] è null
Probabilmente è proprio qui il problema. Come risolvo?
tomminno
01-04-2010, 11:21
Probabilmente è proprio qui il problema. Come risolvo?
tag[a] = new TagLib.Tag() ?
Mattyfog
01-04-2010, 11:42
mi sembra mi desse qualche errore di compilazione..
EDIT: ho controllato e in fase di compilazione dà questo errore: Impossibile creare un'istanza della classe o dell'interfaccia astratta 'TagLib.Tag'
tomminno
01-04-2010, 12:44
mi sembra mi desse qualche errore di compilazione..
EDIT: ho controllato e in fase di compilazione dà questo errore: Impossibile creare un'istanza della classe o dell'interfaccia astratta 'TagLib.Tag'
Scusa ma il tipo di dato esatto lo dovresti conoscere te.
Io ho solo cercato di indovinare il tipo dal codice che hai postato e dato che tag è un array di TagLib.Tag pensavo che fosse un tipo concreto. In tal caso devi trovare nel codice qualche classe che implementi l'interfaccia o classe astratta TagLib.Tag o cercare nella documentazione della libreria.
Mattyfog
01-04-2010, 13:47
Ah, quindi non è un problema di sintassi... Mannaggia..
Credo che risolverò usando un array di string perchè non saprei proprio dove cercare il tipo nel codice sorgente.. :O
astorcas
01-04-2010, 13:49
Ah, quindi non è un problema di sintassi... Mannaggia..
Credo che risolverò usando un array di string perchè non saprei proprio dove cercare il tipo nel codice sorgente.. :O
implementala tu allora, tanto se è una classe astratta è probabile che il lavoro da fare non sia molto :)
Mattyfog
01-04-2010, 19:08
implementala tu allora, tanto se è una classe astratta è probabile che il lavoro da fare non sia molto :)
Ma come faccio ad implementarla? Poi potrei associarla anche a TagLib?
tomminno
01-04-2010, 20:35
Ma come faccio ad implementarla? Poi potrei associarla anche a TagLib?
public class MyTag : TagLib.Tag
{
...
}
L'auto completamento di Visual Studio fa il resto.
Cosa intendi per "associarla anche a TagLib"? TagLib a quanto si può capire dal codice sembra essere un namespace, puoi sempre racchiudere la tua implementazione all'interno di quel namespace.
Mattyfog
01-04-2010, 20:41
Scusa è che sono ignorante... TagLib.Tag è un tipo di variabile che non posso ricreare da zero, credo. Infatti ha alcuni metodi che permettono di salvare un id3 tag su un file mp3. Tant'è che ho dovuto aggiungere questa libreria come dll. Se io faccio questa cosa, che hai detto tu, potrò ancora usufruire di questi metodi per salvare e leggere i tag mp3?
questa opzione la scarterei subito
Guarda che non era una proposta :asd:
Era un tentativo, in assenza di altri dati, di trovare il problema.
Non "ti propongo di sollevare un'eccezione", ma bensi' "facendo cosi', se bla bla, allora ti ritrovi a sollevare un'eccezione"
tomminno
01-04-2010, 22:10
Scusa è che sono ignorante... TagLib.Tag è un tipo di variabile che non posso ricreare da zero, credo. Infatti ha alcuni metodi che permettono di salvare un id3 tag su un file mp3. Tant'è che ho dovuto aggiungere questa libreria come dll. Se io faccio questa cosa, che hai detto tu, potrò ancora usufruire di questi metodi per salvare e leggere i tag mp3?
Scusa ma hai letto la documentazione della libreria?
Ti sei documentato su come funziona e nel caso specifico di come si usa questa classe TagLib.Tag?
Se non lo sai te che conosci la libreria come pretendi che possiamo saperlo noi solo dal nome di una sua classe che scopriamo in seguito essere pure astratta?
Non hai nemmeno riportato il nome di questa libreria.
Questo post va avanti senza che tu abbia fornito dettagli utili, ma solo facendo domande a cui possiamo rispondere solo tirando ad indovinare da quel poco codice che hai postato.
Mattyfog
02-04-2010, 10:01
si avete ragione, solo che io sono molto ignorante e pensavo fosse solo un errore di sintassi..
la libreria è questa: http://developer.novell.com/wiki/index.php/TagLib_Sharp
non pretendo che vi leggiate i sorgenti pertanto userò un ia classe personalizzata.. :)
astorcas
02-04-2010, 11:11
http://developer.novell.com/wiki/index.php/TagLib_Sharp:_Examples
Qua c'è un esempio di come usare 'sta liberira :)
Mattyfog
03-04-2010, 06:34
Ok grazie, ora parto per le vacanze se avrò ancora problemi vi farò sapere
Quando scrivi
risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1)
se per esempio l'ultima collezione avesse 0 oppure 1 elemento solo, cercando di accedere tu al secondo elemento (che e' quello con indice 1), sollevi un'eccezione.
a dire il vero non è così: l'errore è che ha messo <= nel valutare la condizione di uscita dal for quindi andrà sempre in errore indipendentemente dal numero da cui parte (in questo modo l'ultima iterazione andrà a cercare array[array.length] che non esiste).
se la condizione di uscita è giusta, invece, non andrà mai in errore (ricorda che viene valutata la condizione di uscita prima di eseguire qualsiasi iterazione compresa la prima) perché sarà già falsa alla prima iterazione e non ci proverà proprio ad entrare
nel caso che l'array ha 0 o 1 elemento la variabile a non rispetterà la condizione di uscita del for se inizializzata ad 1 e quindi non verrà eseguito nemmeno una volta (bisogna controllare se questa procedura è corretta semanticamente per lo scopo del programma ma sintatticamente è corretta).
a dire il vero non è così: l'errore è che ha messo <= nel valutare la condizione di uscita dal for quindi andrà sempre in errore indipendentemente dal numero da cui parte.
se la condizione di uscita è giusta, invece, non andrà mai in errore (ricorda che viene valutata la condizione di uscita prima di eseguire qualsiasi iterazione compresa la prima) perché sarà già falsa alla prima iterazione e non ci proverà proprio ad entrare
nel caso che l'array ha 0 o 1 elemento la variabile a non rispetterà la condizione di uscita del for se inizializzata ad 1 e quindi non verrà eseguito nemmeno una volta (bisogna controllare se questa procedura è corretta semanticamente per lo scopo del programma ma sintatticamente è corretta).
Nel caso in cui la collezione
risultati_gracenote.Elements().ElementAt(a).Elements()
Avesse un solo elemento, lo scrivere
risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1)
Solleverebbe un'eccezione.
Nel caso in cui la collezione
risultati_gracenote.Elements().ElementAt(a).Elements()
Avesse un solo elemento, lo scrivere
risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1)
Solleverebbe un'eccezione.
gli elementi vengono cercati solo all'interno del for ma non ci entrerà mai se l'array ha meno di due elementi e scrivo il for così:
for (int a = 1; a < risultati_gracenote.Elements().Count(); a++)
{
...
}
perché la condizione viene valutata già prima della prima iterazione e se ho 0 o 1 elementi non verrà eseguito nemmeno una volta in quanto a < risultati_gracenote.Elements().Count() è falso già all'inizio.
il problema è che lui ha scritto il for così:
for (int a = 1; a <= risultati_gracenote.Elements().Count(); a++)
{
...
}
(ha messo minore o uguale nel valutare la condizione invece che strettamente minore) che genera comunque errore indipendentemente dalla lunghezza dell'array perché l'ultima iterazione va a cercare con a == risultati_gracenote.Elements().Count() che da true, cioè un elemento inesistente dell'array. paradossalmente solo l'array di 0 elementi sarebbe eseguito correttamente in quanto non farebbe nemmeno la prima iterazione comunque
Puoi scrievere quello che vuoi in quella gestione di ciclo for, ma se noti e' un'array bidimensionale (probabilmente jagged, o almeno a priori lo e'), e stai ciclando solo sulla prima dimensione.
Quindi se hai 1000 elementi nella prima dimensione, ma l'a-esimo elemento (I.E. il 500) contiene un array di un elemento solo (o addirittura 0 elementi)
risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(1)
sollevera' un'eccezione.
Il massimo che avresti potuto chiedere e'
risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(0)
non sappiamo come ha inizializzato risultati_gracenote (non l'ha scritto), è logico presumere che sia corretto per come è inizializzato o che ci troviamo dentro qualcosa che fa questo controllo prima (visto che ha scritto solo una parte del codice e non tutto).
ad ogni modo secondo quanto dici tu è sbagliato anche prendere la posizione 0 perché potrebbe non avere nemmeno un elemento e generare un eccezione per questo.
pensavo ti riferivi all'inizializzazione di a nel for e non all'interno di quella chiamata con valore 1. ad ogni modo resta che è scritto male il for per quanto detto sopra.
ad ogni modo secondo quanto dici tu è sbagliato anche prendere la posizione 0 perché potrebbe non avere nemmeno un elemento e generare un eccezione per questo.
Certo l'avevo scritto anche io sopra.
Ma la mia era un ipotesi, la ripeto:
SE l'a-esimo elemento (I.E. il 500) contenesse un array di un elemento solo,
ALLORA il massimo che avresti potuto chiedere e'
risultati_gracenote.Elements().ElementAt(a).Elements().ElementAt(0)
diciamo che gli errori sono diversi alcuni anche banali
diciamo che gli errori sono diversi alcuni anche banali
Gia'.
Propongo un qualcosa di simile, come partenza
var domain = ris1.SelectMany(r1 => r1)
.Where(r2=>r2.Count()>=6)
.Select(r2=> new TagLib.Tag()
{
Title = r2["ul"],
Performers = new Performers[1]{r2[3]},
Album = r2[5]
})
.ToArray();
Che funziona solo se i vari array sono strong-typed, ovvero implementano anche IEnumerable<T>, altrimenti se sono vecchi ArrayList occorre aggiuingere qualcosina.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.