C# probléma: 'NullReferenceExeption was unhandled'?
Az objektumhivatkozás nincs beállítva semmilyen objektumpéldányra (NullReferenceExeption was unhandled), hibaüzenetet kapok a 'for' ciklusomon belül, a konvertálásnál. A feladat az lenne hogy össze kell számolni a három rádióadón hány zeneszámot játszottak le.
A forráskód:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace zene
{
class Program
{
static void Main()
{
FileStream fs = new FileStream("musor.txt", FileMode.Open);
StreamReader sr=new StreamReader(fs);
string s = sr.ReadLine();
int db1 = 0;
int db2 = 0;
int db3 = 0;
for (int i = 1; i <= 678; i++)
{
s = sr.ReadLine();
int c = Convert.ToInt32(s[0]);
switch (c)
{
case 1: db1 += 1; break;
case 2: db2 += 1; break;
case 3: db3 += 1; break;
default: { }; break;
}
}
Console.WriteLine("2.feladat:");
Console.WriteLine("1. adó: " + db1);
Console.WriteLine("2. adó: " + db2);
Console.WriteLine("3. adó: " + db3);
Console.ReadLine();
}
}
}
A *.txt fájl, ami az adatokat tartalmazza(musor.txt) első néhány sora:
677
1 5 3 Deep Purple:Bad Attitude
2 3 36 Eric Clapton:Terraplane Blues
3 2 46 Eric Clapton:Crazy Country Hop
3 3 25 Omega:Ablakok
2 4 23 Eric Clapton:Catch Me If You Can
1 3 27 Eric Clapton:Willie And The Hand Jive
3 4 33 Omega:A szamuzott
2 6 20 Eric Clapton:Old love
1 4 55 Deep Purple:Don't Make Me Happy
3 4 10 AC/DC:The Furor
1 3 29 Eric Clapton:Crosscut Saw
2 2 32 Omega:Azt mondta az anyukam
3 3 31 Omega:Udvari bolond kenyere
2 6 6 AC/DC:Let There be Rock
Egy soron belül az első szám a rádióadó száma, a második és a harmadik szám az időtartam 'perc:másodperc' formában, ezután jön a szám címe.
Nalátod, megmondtam, hogy az s[0] lesz a ludas. De nem, debuggolni az büdös. Pedig elég könnyű, beleraksz egy brékpöttyöt, és futtatod. Na mindegy.
Amit viszont elnézel: nem a karakter 0, amit beolvas, hanem a string változó maga null referencia. Ez a lényeg. Null referenciába indexelsz bele -> exception.
Az meg, hogy a toint miért lesz nagy szám... mit adsz át neki? Egy karaktert. A karakternek van egy ascii értéke. Ha a stringet akarod számmá, akkor vedd a 0. karaktert tartalmazó SUBSTRINGET, és azt add át.
"Nyilván pl. 'while(s!=null)'-al is be lehet olvasni, de ha tudom, hogy mennyi sort tartalmaz a .txt fájl anélkül, hogy megszámolnám egyesével az összeset, akkor a 'for' ciklust használom, mert azt valahogy jobban kedvelem."
Elképesztően rossz és káros gondolkozásmód.
Mi van ha megváltozik a TXT fájl, vagy hibás lesz a formázása?
"Tényleg egy sorral többet olvasott be, köszönöm szépen."
LoL, erről beszéltem. :D
"Viszont így megmutatta magát egy másik rejtett probléma, amikor stringből int-be szeretnék konvertálni. Mikor a string [0]-dik indexű elemét, ami csak 1,2 vagy 3 lehet(lásd musor.txt), szeretném int-be konvertálni, olyan értékeket kapok vissza, hogy 49,50,51. Eddig nem volt bajom a konvertálással, de ezt nem értem. Hogy lesz konvertáláls után az 1-ből 49??"
Írasd ki, hogy mit olvastál bele...
"Hogy lesz konvertáláls után az 1-ből 49??"
ajaj...
ToInt32(String):
Converts the specified string representation of a number to an equivalent 32-bit signed integer.
Ha egy szám _karaktert_ akarsz konvertálni számmá (úgy, hogy a kvázi a látható értéket kapja), akkor a
metód a te eszközöd
Bocsánat, rosszat linkeltem a hibával kapcsolatban:
ToInt32(Char)
Converts the value of the specified Unicode character to the equivalent 32-bit signed integer.
Mivel az '1' karakter Ascii kódja 49, így érthető a kapott eredmény.
Hát, a te esetedben egyértelműen arról van szó, hogy nem ismered a függvények tulajdonságait.
Amivel ki lehet kerülni:
Kivételkezelés (Try-catch), VAGY úgy írod meg a programod, hogy ne jelentsen gondot a nullreferencia. Ezt például megteheted egy feltételes elágazással, amibe beleírhatod, hogy ha az adott objektum egy null referencia, akkor legyen egy 'SKIP' ág, egyébként futtassa a programod rendesen.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!