Kezdőoldal » Számítástechnika » Programozás » C# probléma: 'NullReferenceExe...

C# probléma: 'NullReferenceExeption was unhandled'?

Figyelt kérdés

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.



2014. febr. 3. 20:55
 1/10 iostream ***** válasza:
Amennyire nézem a cikluson belül csak két objektum van használva, az sr és az s, ebből az sr nem null, az s[0] viszont lehet az. Debuggold meg, hogy mi az s értéke.
2014. febr. 3. 21:22
Hasznos számodra ez a válasz?
 2/10 A kérdező kommentje:
Mivel a string, és egyben a sor(ok) első karaktere az s[0], és az a itt az rádióállomás száma(1,2 vagy 3 lehet), nem lehet nulla , ahogy végigpörgettem a .txt fájlt nem láttam sehol h nulla lenne a sor első karaktere.
2014. febr. 3. 21:51
 3/10 anonim ***** válasza:
Már eleve a megközelítés rossz, hogy előre beleprogramozod, hány sort fogsz beolvasni. Első ránézésre szerintem itt lesz amúgy a gond, hogy egyel több sort olvasol be, mint ami van: ha megnézed, hogy mit ír a dokumentáció a ReadLine()-ról, láthatod, hogy a fájl végén null-t ad vissza.
2014. febr. 3. 22:15
Hasznos számodra ez a válasz?
 4/10 A kérdező kommentje:
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. Tényleg egy sorral többet olvasott be, köszönöm szépen. 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??
2014. febr. 4. 06:55
 5/10 iostream ***** válasza:

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.

2014. febr. 4. 10:56
Hasznos számodra ez a válasz?
 6/10 anonim ***** válasza:

"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...

2014. febr. 4. 11:02
Hasznos számodra ez a válasz?
 7/10 anonim ***** válasza:

"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

[link]

metód a te eszközöd

2014. febr. 4. 13:10
Hasznos számodra ez a válasz?
 8/10 anonim ***** válasza:

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.

2014. febr. 4. 13:16
Hasznos számodra ez a válasz?
 9/10 anonim ***** válasza:

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.

2014. febr. 4. 21:31
Hasznos számodra ez a válasz?
 10/10 A kérdező kommentje:
Köszönöm a válaszokat, ma este majd nekiülök ennek a programnak, tegnap egy másikat kellett csinálnom. Az utolsónak azt üzenem, h nem vagyok dimplomás informatikus, csak az emelt szintű érettségire készülök, nyilván nem ismerem teljesen a nyelvet.
2014. febr. 5. 07:16

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!