Grafikus C# – Windows Forms tanfolyam › 13.1 lecke Windows Forms · 13.1 lecke · hibakeresés 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 (Fordítási hibák, Error List
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.
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.
A hibák három fajtája
| Fajta | Mikor 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. |
try–catch (13.4 lecke).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
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 8CS0103: 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).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ő ok | Javítás |
|---|---|---|---|
CS1002, CS1513, CS1026 | ; / } / ) hiányzik | Elfelejtett 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). |
CS0103 | A név nem létezik az adott környezetben | Elí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). |
CS0029 | Nem alakítható implicit módon (pl. string → int) | Típuseltérés. | Konvertálj: int.Parse, TryParse, .ToString(). |
CS0266 | Nem 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. |
CS0165 | Nem hozzárendelt változó használata | A változónak nincs kezdőértéke minden ágon. | Adj kezdőértéket (string s = "";). |
CS0161 | Nem minden ág ad vissza értéket | Egy if után nincs return. | Adj returnt a hiányzó ágra is. |
CS0246 | A típus vagy névtér nem található | Hiányzó using, vagy elírt típusnév. | Ctrl+. → using hozzáadása. |
CS1061 | A típus nem tartalmaz ilyen tagot | Elírt metódus- vagy tulajdonságnév. | Használd az IntelliSense listát; ellenőrizd a típust. |
CS1503, CS1502 | Az argumentum nem alakítható a paraméter típusára | Rossz típusú vagy rossz sorrendű argumentum. | Nézd a metódus szignatúráját (Ctrl+Shift+Space). |
CS0128, CS0136 | Ilyen nevű változó már létezik | Kétszer deklarált név ugyanabban a hatókörben. | Nevezd át, vagy ne deklarálj újra, csak értéket adj. |
CS0120 | Statikus metódus nem érheti el a példány-tagot | Példány-mező használata static metódusban. | Vedd el a staticet, vagy adj át paramétert. |
CS0019 | Az operátor nem alkalmazható ezekre a típusokra | Pl. string > int, vagy = a feltételben. | Egyeztesd a típusokat; feltételben ==. |
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
}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
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)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.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.
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. Valószínűleg egy hiányzó Ok és javítás
} 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. A tényleges ok az előző sorokban van (hiányzó Ok és javítás
;, ), }). 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. 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.Ok és javítás
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. A gyors javítás a hibát „elnyomta”, de nem az okot oldotta meg (például Ok és javítás
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:
- Új projekt: hozz létre egy Windows Forms projektet (
Hibavadasz), aForm1legyentxtEv(TextBox),lblEredmeny(Label),btnSzamolésbtnTorolgombbal. - 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. - 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.
- 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).
- 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).
- Figyelmeztetések: a hibák után a figyelmeztetéseket is takarítsd el (
CS0168,CS0219,CS0162). - 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.
- 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
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!)
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
}
}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 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.Egy lehetséges megoldás
2. Lavina
Szándékosan hagyj ki egy Sok hiba keletkezik (}-t egy metódus végén, és figyeld meg az Error List-et.Egy lehetséges megoldás
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. 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).Egy lehetséges megoldás
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. (a) fordítási; (b) futási; (c) logikai.Megoldás megnyitása
2. Hibakód
Mit jelent a CS0103? A név nem létezik az adott környezetben (elírás, nincs deklarálva, hatókörön kívül).Megoldás megnyitása
Közepes szint
3. Mit javítasz elsőnek?
Az Error List 12 hibát mutat. Melyikkel kezded, és miért? A legelsővel (felül, a legkisebb sorszámú): a többi gyakran csak következmény. Javítás után újrafordítasz.Megoldás megnyitása
4. CS0266 vagy CS0029?
Mi a különbség a két típus-hiba között? CS0029: egyáltalán nem alakítható (Megoldás megnyitása
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? A Build Only szűrő az igazság: az IntelliSense gyorsítótára elavult lehet. Rebuild, szükség esetén a Megoldás megnyitása
.vs mappa törlése és újraindítás.
6. Szándékos figyelmeztetés
Mikor elfogadható egy figyelmeztetés elnyomá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ó.Megoldás megnyitása
Gyors önellenőrzés
Válaszolj fejben, és csak utána nyisd le a választ. Fordítási, futási és logikai. A hibák kódját, leírását, fájlját és sorát; dupla kattintás a hibára ugrik. A későbbi hibák gyakran következmények (lavina). Gyorsjavítási javaslatok: using, változó, metódus létrehozása. Clean + Build: mindent újrafordít. Gyakran valódi hibát jeleznek (elírt név, elérhetetlen kód, null). A logikai: semmi sem jelzi, és rossz eredményt ad.1. Melyik a három hibafajta?
2. Mit mutat az Error List?
3. Miért az első hibával kezdesz?
4. Mire jó a Ctrl+.?
5. Mi a Rebuild?
6. Miért kell a figyelmeztetésekkel törődni?
7. Melyik hiba a legveszélyesebb?
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.


