Grafikus C# – Windows Forms tanfolyam › 13.1 lecke

Windows Forms · 13.1 lecke · hibakeresés

Fordítási hibák, Error List

Minden programozó naponta lát hibaüzeneteket: ez nem kudarc, hanem a munka természetes része. A különbség az, hogy a kezdő megijed az üzenettől és találgat, a gyakorlott programozó pedig elolvassa, mert a hibaüzenet szinte mindig megmondja, hol és mi a baj. Ebben a leckében megtanulod, hogyan különböztesd meg a hibák három fajtáját, hogyan használd az Error List ablakot, hogyan olvasd el a hibakódot (CS0103, CS0029...), melyek a leggyakoribb fordítási hibák és mi a javításuk, hogyan kezeld a figyelmeztetéseket, és hogyan segítenek a gyorsjavítások. Ez a fejezet alapja: a következő leckékben a futási és logikai hibákat vadásszuk.

  • kb. 90 perc
  • kezdő–közepes szint
  • hibakeresés
Anime stílusú diák hibavadászként keresi a hibát a kódban

A lecke végére

  • megkülönbözted a fordítási, futási és logikai hibát;
  • használod az Error List ablakot (szűrés, ugrás a hibára, hibakód);
  • elolvasod a hibaüzenetet, és megtalálod a valódi okot (az első hibával kezdesz);
  • felismered és javítod a leggyakoribb hibákat (CS1002, CS0103, CS0029, CS0246, CS0161...);
  • nem hagyod figyelmen kívül a figyelmeztetéseket;
  • használod a gyorsjavításokat (Ctrl+.) és a Build / Clean / Rebuild parancsokat.

Mielőtt elkezded

Ehhez a leckéhez az 1–5. fejezet alapjai szükségesek (változók, típusok, metódusok, események). Nem kell hozzá semmi új, csak egy Windows Forms projekt a Visual Studióban.

12.10 Karbantartható alkalmazás →

A hibák három fajtája

FajtaMikor derül ki?Hogyan jelentkezik?Példa
Fordítási hiba (compile error)A fordításkor (Build), a program el sem indul.Hibaüzenet az Error Listben, piros hullámos vonal a kódban.Elírt változónév, hiányzó pontosvessző, rossz típus.
Futási hiba (runtime error)A program futása közben.Kivétel (exception) és kezeletlen hibaablak, a program leáll.Osztás nullával, null elérése, hiányzó fájl.
Logikai hiba (logic error)Futáskor, de nem jelez semmit: rossz az eredmény.Nincs hibaüzenet: a program „jól” fut, csak nem azt csinálja, amit kellene.Rossz képlet, fordított feltétel, eggyel elcsúszott ciklus.
A fordítási hiba a legkönnyebbA fordító pontosan megmondja a helyet és az okot. A hibát a program indulása előtt kell javítanod: ez a legjobb eset, mert a felhasználó soha nem látja.
A futási hiba nehezebbA program lefordul, de bizonyos bemenetnél elromlik. A kivétel üzenetéből és a hívási veremből (Call Stack, 13.3 lecke) kiderül, hol. A megelőzése: ellenőrzés és try–catch (13.4 lecke).
A logikai hiba a legalattomosabbSemmi sem jelzi. Csak a tesztelés (13.8 lecke) és a lépésenkénti futtatás (13.2 lecke) hozza elő. A „jónak látszó” rossz eredmény sokkal veszélyesebb, mint az összeomlás.
Melyik a legrosszabb?Fordított sorrendben a felhasználónak: logikai hiba (észrevétlen, rossz adat), futási hiba (összeomlás), fordítási hiba (nem is látja). Ezért a cél, hogy minél több hiba fordításkor derüljön ki (például erős típusokkal, enum-mal).

Jósolj!

Az átlag képlete (a + b + c) / 2 hibás (osztó 2). A program lefordul, fut, és kiír egy számot. Milyen fajta hiba ez, és ki fogja észrevenni?

Jóslat ellenőrzése

Logikai hiba: nincs fordítási hiba, nincs kivétel. Csak az veszi észre, aki az eredményt kézzel ellenőrzi (teszteli) egy ismert példával (például 2, 4, 6 átlaga 4 kell legyen, a program 6-ot ír).

Az Error List és a hibaüzenet olvasása

Error List (View → Error List, Ctrl+\ , E)kimenet
Code    Description                                              File         Line
CS0103 The name 'atlagg' does not exist in the current context Form1.cs 14
CS0029 Cannot implicitly convert type 'string' to 'int' Form1.cs 11
CS1002 ; expected Form1.cs 8
Mit mond az üzenet?Három része van: a kód (CS0103: keresésre és súgóra), a leírás (mi a baj), és a hely (fájl, sor). Az üzenet a hibát jelzi, de az ok néha az előző sorban van (például hiányzó pontosvessző vagy kapcsos zárójel).
Dupla kattintásAz Error List sorára kattintva a szerkesztő a hibás sorra ugrik. A hibakódra F1 (vagy a kód keresése a Microsoft Learn oldalon) részletes magyarázatot és példát ad.
SzűrésAz Error List tetején a Build Only csak a fordítási hibákat mutatja, az Errors / Warnings / Messages gombokkal szűrhetsz. Az IntelliSense hibák (a szerkesztő azonnali jelzései) néha eltérhetnek a valódi fordítástól: a Build Only a megbízható.
Az első hiba az elsőEgy hiba sok további hibát okozhat (lavina): egy hiányzó kapcsos zárójel után akár 30 üzenet jön. Mindig a legelső hibát (legfelső sor, legkisebb sor) javítsd, fordíts újra, és nézd meg, hány maradt.

Jósolj!

Az Error List 25 hibát mutat. Az első hiba egy hiányzó } a metódus végén (8. sor). A többi hiba mind a 9–60. sorokban van. Hányat kell valójában javítanod?

Jóslat ellenőrzése

Valószínűleg egyet: a hiányzó zárójel a fordító számára összekeveri a szerkezetet, és a következő sorok mind „hibásnak” látszanak. Javítsd az elsőt, fordíts újra: a többi legtöbbször eltűnik.

A leggyakoribb fordítási hibák

KódÜzenet (röviden)Jellemző okJavítás
CS1002, CS1513, CS1026; / } / ) hiányzikElfelejtett záró jel; a hiba az előző sorban is lehet.Pótold a hiányzó jelet; ellenőrizd a zárójelek párosítását (a VS kiemeli a párját).
CS0103A név nem létezik az adott környezetbenElírt változó, nincs deklarálva, hatókörön kívül van.Javítsd a nevet, deklaráld, vagy vidd ki a hatókörből (változó élettartama).
CS0029Nem alakítható implicit módon (pl. string → int)Típuseltérés.Konvertálj: int.Parse, TryParse, .ToString().
CS0266Nem alakítható implicit módon (pl. double → int)Információvesztő átalakítás.Explicit kasztolás (int) vagy Math.Round; döntsd el a kerekítést.
CS0165Nem hozzárendelt változó használataA változónak nincs kezdőértéke minden ágon.Adj kezdőértéket (string s = "";).
CS0161Nem minden ág ad vissza értéketEgy if után nincs return.Adj returnt a hiányzó ágra is.
CS0246A típus vagy névtér nem találhatóHiányzó using, vagy elírt típusnév.Ctrl+. → using hozzáadása.
CS1061A típus nem tartalmaz ilyen tagotElírt metódus- vagy tulajdonságnév.Használd az IntelliSense listát; ellenőrizd a típust.
CS1503, CS1502Az argumentum nem alakítható a paraméter típusáraRossz típusú vagy rossz sorrendű argumentum.Nézd a metódus szignatúráját (Ctrl+Shift+Space).
CS0128, CS0136Ilyen nevű változó már létezikKétszer deklarált név ugyanabban a hatókörben.Nevezd át, vagy ne deklarálj újra, csak értéket adj.
CS0120Statikus metódus nem érheti el a példány-tagotPéldány-mező használata static metódusban.Vedd el a staticet, vagy adj át paramétert.
CS0019Az operátor nem alkalmazható ezekre a típusokraPl. string > int, vagy = a feltételben.Egyeztesd a típusokat; feltételben ==.
Rövid hibás részletC#
private void btnSzamol_Click(object sender, EventArgs e)
{
int kor = txtKor.Text; // CS0029: string → int
double atlag = 8.5;
int egesz = atlag; // CS0266: double → int
lblEredmeny.Text = "Kor: " + korr; // CS0103: a "korr" nem létezik
}
JavítvaC#
private void btnSzamol_Click(object sender, EventArgs e)
{
int kor;

if (!int.TryParse(txtKor.Text, out kor)) { lblEredmeny.Text = "Számot adj meg!"; return; } // a TryParse a futási hibát is megelőzi

double atlag = 8.5;
int egesz = (int)Math.Round(atlag); // tudatos kerekítés

lblEredmeny.Text = "Kor: " + kor + ", átlag egészen: " + egesz;
}

Jósolj!

A kódban if (szam = 5) { ... } áll (egy =). Mit jelez a fordító, és miért nem engedi?

Jóslat ellenőrzése

Hibát (CS0029: az int nem alakítható bool-lá): az = értéket ad, és int eredményt ad, de az if bool feltételt vár. A C# ezzel kivédi a C-ből ismert klasszikus hibát. Összehasonlításhoz == kell.

Figyelmeztetések, gyorsjavítások, Build

Form1.csC#
private void Proba()
{
int nemHasznalt; // CS0168: a változó deklarálva van, de soha nincs használva
int kiszamolt = 5 * 3; // CS0219: értéket kapott, de sosem használják

return;
lblEredmeny.Text = "ez sosem fut le"; // CS0162: elérhetetlen kód
}

public string Nev { get; set; } // CS8618: nem nullázható tulajdonság nincs inicializálva (újabb .NET)
A figyelmeztetés nem hiba, de jelA program lefordul, de a fordító szerint valami gyanús: használatlan változó (valószínűleg elírás vagy elfelejtett kód), elérhetetlen kód, nem inicializált tulajdonság. Sok figyelmeztetés mögött tényleges hiba van.
Ne hagyd felhalmozódniHa 200 figyelmeztetés áll az Error Listben, a fontos elvész közöttük. Javítsd őket, hogy a lista üres legyen: az új, valóban fontos jelzés azonnal feltűnik.
Nullázhatósági figyelmeztetésekAz újabb .NET nullable szolgáltatása (CS8600–CS8618) a null-ra utal, amely a NullReferenceException futási hibát okozná: a fordító előre szól. Az ? típusjelölés (string?) és az ellenőrzés a megoldás.
Figyelmeztetés hibakéntA projekt tulajdonságaiban (Build → Treat warnings as errors) a figyelmeztetések hibává tehetők: szigorúbb, fegyelmezettebb kód. Fokozatosan, egyes kódokra kapcsold be.

Gyorsjavítás (Quick Actions)

A hullámos vonalra állva a Ctrl+. (vagy a villanykörte ikon) javítási javaslatokat ad: using hozzáadása, metódus létrehozása, változó deklarálása, típus átalakítása. Mindig olvasd el, mit csinál: a gyors javítás nem gondolkodik helyetted.

Build, Clean, Rebuild

Build: csak a módosult részeket fordítja. Clean: törli a korábbi fordítási eredményeket. Rebuild: Clean + Build, mindent újrafordít. Ha az Error List „furcsa”, régi hibát mutat vagy a Designer nem frissül, a Rebuild Solution gyakran megoldja (Ctrl+Shift+B a Build).

Jósolj!

A CS0168 figyelmeztetés szerint a int ertek; változót nem használod. Valójában a kódban int erteke = 5; áll, és a lblEredmeny.Text = ertek.ToString();... Mi a valódi hiba?

Jóslat ellenőrzése

Ha a változót két néven deklaráltad (ertek és erteke), az egyik soha nincs használva (CS0168/CS0219), a másikat nem is deklaráltad (CS0103, vagy CS0165). A figyelmeztetés itt elírásra figyelmeztet: ezért érdemes elolvasni őket.

📷 Képernyőkép helye

Mit tegyél ide: az Error List a hibavadász-labor tizenkét hibájával, és a javítás után az üres lista.Javasolt fájlnév: winforms-13-1-error-list.webp · Alt szöveg: Az Error List fordítási hibákkal

Hibakeresés: te vagy a hibadetektív

Mi a baj, és hogyan javítod?

Gondold végig az okot, és csak utána nyisd le a megoldást.

1. 40 hiba egyszerre

Hozzáadtál egy új metódust, és hirtelen az Error List 40 hibát mutat a teljes fájlban.

Ok és javítás

Valószínűleg egy hiányzó } vagy ; van a legelső hibás helyen. Javítsd csak az elsőt, fordíts újra.

2. CS0246: a List típus nem található

List<int> szamok = new List<int>();
Hiba és javítás

Hiányzik a using System.Collections.Generic; sor (új projekteknél ez automatikus). Ctrl+. felajánlja.

3. A hiba a kódban nincs ott, ahol jelzi

A hiba a 15. sorra mutat, de a 15. sor rendben van.

Ok és javítás

A tényleges ok az előző sorokban van (hiányzó ;, ), }). Nézd meg a 14., 13. sort is.

4. A javított hiba nem tűnik el

Javítottad a kódot, de az Error List ugyanazt mutatja.

Ok és javítás

Régi fordítási állapot vagy elavult IntelliSense: Build Only szűrő, Rebuild Solution, szükség esetén a Visual Studio újraindítása.

5. CS0161 a metódusnál

private string Jegy(int pont)
{
if (pont >= 90) { return "5"; }
else if (pont >= 70) { return "4"; }
}
Hiba és javítás

Ha egyik feltétel sem igaz, nincs return. Adj egy záró returnt (vagy else ágat) minden esetre.

6. A javaslat elrontja a kódot

A Ctrl+. javaslatát elfogadtad, és utána új hibák jelentek meg.

Ok és javítás

A gyors javítás a hibát „elnyomta”, de nem az okot oldotta meg (például object típust adott, vagy üres metódust hozott létre). Vond vissza (Ctrl+Z), értsd meg az okot, és javítsd tudatosan.

Mini projekt: hibavadász-labor

Kapsz egy programot tizenkét fordítási hibával. Feladatod: a hibákat egyenként megtalálni és kijavítani, közben hibanaplót vezetni:

  1. Új projekt: hozz létre egy Windows Forms projektet (Hibavadasz), a Form1 legyen txtEv (TextBox), lblEredmeny (Label), btnSzamol és btnTorol gombbal.
  2. Másold be a hibás kódot (lent) a Form1.cs-be, és fordítsd le (Ctrl+Shift+B): az Error List mutatja a hibákat.
  3. Hibanapló: egy táblázatban (füzet vagy fájl) vezesd minden hibára: hibakód, sor, mit jelent, mi volt az ok, hogyan javítottad.
  4. Sorrend: mindig a legelső hibával kezdd; javítás után fordíts újra, és jegyezd fel, hány hiba maradt (a lavina-hatás megfigyelése).
  5. Gyorsjavítás: legalább két hibát a Ctrl+. segítségével javíts, és írd le, mit csinált a javaslat (és volt-e jobb megoldás).
  6. Figyelmeztetések: a hibák után a figyelmeztetéseket is takarítsd el (CS0168, CS0219, CS0162).
  7. Ellenőrzés: futtasd a programot; a Számol gombnak a beírt évből ki kell számolnia a kort, a Töröl gombnak törölnie kell a mezőt és az eredményt. A javított program legyen hibamentes és figyelmeztetésmentes.
  8. Saját hibák: szúrj be három új hibát egy barátod számára (különböző kódokkal), és kérd meg, hogy hibanaplóval javítsa ki.
A hibás kód és a hibák listája
Form1.cs (HIBÁS)C#
using System;
using System.Windows.Forms;

namespace Hibavadasz
{
public partial class Form1 : Form
{
private int szamlalo;

public Form1()
{
InitializeComponent() // 1.
}

private void btnSzamol_Click(object sender, EventArgs e)
{
int ev = txtEv.Text; // 2.
double atlag = Atlag(5, 7, 9);
int egesz = atlag; // 3.
lblEredmeny.Text = "Átlag: " + atlagg; // 4.
string uzenet;
MessageBox.Show(uzenet); // 5.
}

private double Atlag(int a, int b, int c)
{
if (a > 0) { return (a + b + c) / 3.0; } // 6.
}

private void btnTorol_Click(object sender, EventArgs e)
{
List<int> lista = new List<int>(); // 7.
lista.Add("tíz"); // 8.
lista.Hossz(); // 9.
int x = 1;
int x = 2; // 10.
}

private static void Seged() { szamlalo++; } // 11.

private void Ellenorzes() { if (szamlalo = 5) { } } // 12.
}
}

A tizenkét hiba kódja: 1. CS1002; 2. CS0029; 3. CS0266; 4. CS0103; 5. CS0165; 6. CS0161; 7. CS0246; 8. CS1503 (és CS1950); 9. CS1061; 10. CS0128; 11. CS0120; 12. CS0029. A pontos sorszámok és néhány kód a Visual Studio verziójától függően eltérhet: a naplóba a valódi kimenetet írd.

A javított kód (próbáld ki előbb önállóan!)
Form1.cs (JAVÍTVA)C#
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Hibavadasz
{
public partial class Form1 : Form
{
private int szamlalo;

public Form1()
{
InitializeComponent(); // 1. hiányzó ;
}

private void btnSzamol_Click(object sender, EventArgs e)
{
int ev;

if (!int.TryParse(txtEv.Text, out ev)) // 2. string → int: TryParse
{
lblEredmeny.Text = "Számot adj meg!";
return;
}

double atlag = Atlag(5, 7, 9);
int egesz = (int)Math.Round(atlag); // 3. explicit, tudatos kerekítés
lblEredmeny.Text = "Kor: " + (DateTime.Now.Year - ev) + ", átlag: " + atlag + " (" + egesz + ")"; // 4. a név javítva (atlag)

string uzenet = "Kész"; // 5. kezdőérték
MessageBox.Show(uzenet);
}

private double Atlag(int a, int b, int c)
{
if (a > 0) { return (a + b + c) / 3.0; }

return 0; // 6. minden ágon van return
}

private void btnTorol_Click(object sender, EventArgs e)
{
List<int> lista = new List<int>(); // 7. a using pótolva
lista.Add(10); // 8. int kell, nem string
int hossz = lista.Count; // 9. Count, nem Hossz()
int x = 1;
x = 2; // 10. nem deklaráljuk újra

txtEv.Clear();
lblEredmeny.Text = "Törölve (" + hossz + " elem a listában, x = " + x + ")";
}

private void Seged() { szamlalo++; } // 11. nem static

private void Ellenorzes() { if (szamlalo == 5) { } } // 12. == az összehasonlításhoz
}
}
📷 Képernyőkép helye

Mit tegyél ide: a kitöltött hibanapló egy részlete.Javasolt fájlnév: winforms-13-1-hibanaplo.webp · Alt szöveg: A hibavadász-labor hibanaplója

Három önálló gyakorlófeladat

Egyszerre csak egyet csinálj: tervezd meg, írd meg, futtasd, ellenőrizd, és csak utána nyisd ki a megoldást.

1. Saját hibakatalógus

Gyűjts össze tíz hibát, amit te magad vétettél, kódokkal és javítással, egy jegyzetben.

Egy lehetséges megoldás

Egy táblázat: kód, mi volt a hiba, hogyan ismerted fel, hogyan előzöd meg legközelebb. A saját katalógus gyorsabb a keresésnél, és a „szokásos gyanúsítottakat” mutatja.

2. Lavina

Szándékosan hagyj ki egy }-t egy metódus végén, és figyeld meg az Error List-et.

Egy lehetséges megoldás

Sok hiba keletkezik (CS1513, CS1519, CS0116...). Pótolva az első hibát, a többi eltűnik. Ez bizonyítja: mindig az elsőt javítsd.

3. Warnings as errors

Kapcsold be egy projektben a figyelmeztetéseket hibaként, és javítsd az összeset.

Egy lehetséges megoldás

Project → Properties → Build → Treat warnings as errors (vagy az adott kódokra). Először számold meg a figyelmeztetéseket, és kategóriák szerint javítsd (nem használt változók, nullázhatóság, elérhetetlen kód).

Gyakorlótár: 6 további feladat

Három szinten gyakorolhatsz: alap, közepes és kihívás. Csak a próbálkozás után nyisd le a megoldást.

Alap szint

1. Melyik hibafajta?

Sorold be: (a) hiányzó pontosvessző; (b) osztás nullával; (c) rossz képlet.

Megoldás megnyitása

(a) fordítási; (b) futási; (c) logikai.

2. Hibakód

Mit jelent a CS0103?

Megoldás megnyitása

A név nem létezik az adott környezetben (elírás, nincs deklarálva, hatókörön kívül).

Közepes szint

3. Mit javítasz elsőnek?

Az Error List 12 hibát mutat. Melyikkel kezded, és miért?

Megoldás megnyitása

A legelsővel (felül, a legkisebb sorszámú): a többi gyakran csak következmény. Javítás után újrafordítasz.

4. CS0266 vagy CS0029?

Mi a különbség a két típus-hiba között?

Megoldás megnyitása

CS0029: egyáltalán nem alakítható (string → int); CS0266: alakítható, de explicit kasztolás kell (double → int, információvesztés).

Kihívás szint

5. IntelliSense vs. Build

Az IntelliSense hibát jelez, a Build tiszta. Mit teszel?

Megoldás megnyitása

A Build Only szűrő az igazság: az IntelliSense gyorsítótára elavult lehet. Rebuild, szükség esetén a .vs mappa törlése és újraindítás.

6. Szándékos figyelmeztetés

Mikor elfogadható egy figyelmeztetés elnyomása?

Megoldás megnyitása

Ha megértetted az okát, és tudatosan úgy döntöttél (például egy ismert, hamis jelzés); megjegyzéssel indokolva. A „nem tudom, mi ez, tehát eltüntetem” nem elfogadható.

Gyors önellenőrzés

Válaszolj fejben, és csak utána nyisd le a választ.

1. Melyik a három hibafajta?

Fordítási, futási és logikai.

2. Mit mutat az Error List?

A hibák kódját, leírását, fájlját és sorát; dupla kattintás a hibára ugrik.

3. Miért az első hibával kezdesz?

A későbbi hibák gyakran következmények (lavina).

4. Mire jó a Ctrl+.?

Gyorsjavítási javaslatok: using, változó, metódus létrehozása.

5. Mi a Rebuild?

Clean + Build: mindent újrafordít.

6. Miért kell a figyelmeztetésekkel törődni?

Gyakran valódi hibát jeleznek (elírt név, elérhetetlen kód, null).

7. Melyik hiba a legveszélyesebb?

A logikai: semmi sem jelzi, és rossz eredményt ad.

Mit tudsz már?

  • Megkülönbözteted a fordítási, futási és logikai hibát.
  • Az Error List-et és a hibakódot használod, és az első hibával kezdesz.
  • Felismered és javítod a leggyakoribb fordítási hibákat.
  • A figyelmeztetéseket komolyan veszed, a gyorsjavításokat tudatosan használod.

Következő lecke: Breakpoint, Step Into, Step Over

A futás lépésenkénti követése: megállítod a programot, és megnézed, mi történik benne.