Grafikus C# – Windows Forms tanfolyam › 13.3 lecke

Windows Forms · 13.3 lecke · hibakeresés

Locals, Watch és Call Stack

A töréspont megállítja a programot, de a hibakeresés igazi ereje akkor jön elő, amikor belenézel a megállított program belsejébe: mi a változók értéke, mi a kifejezés eredménye, és hogyan jutott ide a program. Ehhez három eszközt használunk: a Locals/Autos/Watch ablakokat (a változók és kifejezések értékei), az Immediate ablakot (kifejezések kiértékelése és kipróbálása menet közben), és a Call Stacket (a hívási lánc). Megtanulod azt is, hogyan viselkedik a hibakereső kivételnél, és hogyan dolgozz tudományos módszerrel: hipotézis, megfigyelés, javítás, ellenőrzés.

  • kb. 100 perc
  • közepes szint
  • megfigyelés
Anime stílusú kódmentor fiú magyaráz

A lecke végére

  • használod a Locals, Autos és Watch ablakot a változók és kifejezések értékeinek figyelésére;
  • használod a DataTipet (egérmutató) és a Quick Watchot (Shift+F9);
  • menet közben módosítod a változók értékét hipotézisek kipróbálására;
  • az Immediate ablakban kifejezéseket értékelsz ki, és metódust hívsz;
  • olvasod a Call Stacket, és a keretek között váltva látod, ki hívta kit;
  • kivételnél megállítod a hibakeresőt, és a $exception változóból olvasod az okot;
  • hibát keresel módszeresen (reprodukálás, hipotézis, felező keresés).

Mielőtt elkezded

Ehhez a leckéhez a 13.2 lecke (töréspont, léptetés) szükséges.

13.2 Breakpoint →

Locals, Autos, Watch, DataTip

EszközHol?Mit mutat?
LocalsDebug → Windows → LocalsAz aktuális metódus összes helyi változója és paramétere, értékkel.
AutosDebug → Windows → AutosA megállási sorhoz közeli változók és az előző sor eredménye.
Watch 1–4Debug → Windows → WatchAz általad megadott kifejezések (osszeg / lista.Count, nev.Length), amelyek léptetés közben frissülnek.
DataTipegér a változó föléGyors értékmutatás; kinyitható; kitűzhető (pin).
Quick WatchShift+F9Egy kifejezés egyszeri kiértékelése párbeszédablakban.
Form1.csC#
private double Atlag(List<int> jegyek)
{
int osszeg = 0;

foreach (int j in jegyek)
{
osszeg += j; // ● töréspont: a Locals ablakban: j, osszeg, jegyek (kinyitható: Count, elemek)
}

return (double)osszeg / jegyek.Count; // Watch: osszeg / jegyek.Count (hibás: egész osztás!) és (double)osszeg / jegyek.Count
}
Piros: ami változottA Locals/Watch azokat az értékeket pirossal jelöli, amelyek az előző lépés óta változtak. Ez az egyik leggyorsabb módja annak, hogy lásd, melyik sor mit módosított.
Objektumok és gyűjteményekA List, tömb vagy objektum mellett nyíl van: kinyitva látod a tagjait és elemeit. Egy List-nél a Count és az elemek; a string mellett a nagyító ikon (Text Visualizer) hosszú szöveg olvasásához.
Érték módosításaAz értékre duplán kattintva átírhatod (például az osszeg-ot). Így kipróbálod a hipotézist: „ha ez a szám 5 lenne, jó lenne-e a vége?” Nem kell újraindítani és újragépelni. Ez ideiglenes: a kódot a javítás során írd át.
Watch kifejezésekA Watch ablakba bármilyen C# kifejezést beírhatsz (jegyek.Count > 0, nev.ToUpper(), osszeg / 2.0). A kifejezések értékét minden lépésnél újraszámolja. Mellékhatásos kifejezést (módosító metódust) ne írj ide.

Jósolj!

A Locals ablakban az osszeg és a j mellett a jegyek is látszik. A jegyek Count értéke 0, de a ciklus (foreach) még nem futott le. Mi lesz a return soron az (double)osszeg / jegyek.Count kifejezés értéke?

Jóslat ellenőrzése

A valós osztás nullával nem kivétel, hanem NaN (vagy végtelen): 0.0 / 0 = NaN, 5.0 / 0 = ∞. Egész osztásnál viszont DivideByZeroException. A Watch ablak azonnal megmutatja a különbséget a két kifejezéssel, mielőtt a sor lefutna.

Az Immediate ablak

Debug → Windows → Immediate (Ctrl+Alt+I)kimenet
> ? osszeg
15
> ? jegyek.Count
3
> ? (double)osszeg / jegyek.Count
5
> ? jegyek[0] + jegyek[1]
9
> osszeg = 100 (érték módosítása)
100
> ? txtNev.Text.Trim().ToLower()
"anna"
> ? Atlag(new List<int> { 5, 4, 3 }) (metódus hívása)
4
Mire jó?Az Immediate ablakban (megállított programnál) bármilyen C# kifejezést kiértékelhetsz: ? kifejezés (vagy ? nélkül is). Kipróbálhatsz egy javítást mielőtt átírod a kódot: működne-e nev.Trim()? Mit ad a Math.Round(2.5)?
Metódus hívásaA programod metódusait is meghívhatod, tetszőleges bemenettel: ? Atlag(new List<int> { 5, 4, 3 }). Így a logikát kipróbálod a gombnyomás és a felület nélkül.
Érték módosításaAz osszeg = 100 a változó értékét átírja a futó programban (mint a Locals-ban). Mellékhatással jár: a program további futását befolyásolja.
Mellékhatás vigyázatAz Immediate ablak kifejezései valóban lefutnak: egy lista.Clear() törli a listát, egy Mentes() mentést végez. Csak ártalmatlan kifejezéseket írj.

Jósolj!

A megállított programban az Immediate ablakba beírod: ? lista.Remove(lista[0]). Mi történik a programmal?

Jóslat ellenőrzése

A kifejezés valóban eltávolítja az első elemet a futó program listájából (és True-t ad vissza): a további futás már a módosított listával történik. Az Immediate ablak nem „csak olvas”: a mellékhatás valós.

A Call Stack: hogyan jutott ide a program?

Debug → Windows → Call Stack (Ctrl+Alt+C)kimenet
Name                                                  Language
► Kosar.exe!Kosar.Form1.Osszeg() Line 52 C# ← itt állsz (legfelül: az aktuális metódus)
Kosar.exe!Kosar.Form1.Kiir() Line 41 C# ← ezt hívta az Osszeg
Kosar.exe!Kosar.Form1.btnOsszesit_Click() Line 28 C# ← a gombkezelő hívta a Kiir-t
[External Code] ← a Windows Forms keretrendszer (az eseményt kiváltotta)
A hívási láncA Call Stack mutatja, melyik metódus melyiket hívta, a megállás helyétől visszafelé a belépési pontig. A legfelső az aktuális metódus; alatta a hívója, és így tovább. Ez a verem (stack): ahogy a hívások egymásra épülnek.
Keretek közti váltásEgy sorra duplán kattintva a hibakereső a hívó metódus megfelelő sorába ugrik, és a Locals ablak annak a metódusnak a változóit mutatja. Így láthatod, milyen paraméterekkel hívták, és mi volt a hívó állapota.
[External Code]A szürke External Code a nem a te kódod (Windows Forms, .NET): elrejtve, a Just My Code miatt. A lényeg: az eseménykezelő (btnOsszesit_Click) a belépési pont, azt a keretrendszer hívja.
Kivételnél: a stack traceA kivétel is hívási láncot hordoz (ex.StackTrace): ugyanazt mutatja, hogy hol és milyen úton keletkezett. A felülről lefelé olvasott sorokban az első a keletkezés helye, az utolsó a belépési pont.

Jósolj!

Az Osszeg() metódusban kivétel keletkezik egy rossz paraméter miatt. A hiba oka valójában a Kiir() hívó metódusban van (hibás argumentumot ad át). Melyik keretet nézed meg a Call Stackben?

Jóslat ellenőrzése

A második keretet (Kiir()): rákattintva a Locals mutatja, milyen értéket adott át. A hiba helye (amelyik metódusban a kivétel keletkezett) gyakran nem az ok helye: az ok néha a hívóban van.

Kivétel a hibakeresőben

Form1.csC#
private void btnSzamol_Click(object sender, EventArgs e)
{
string szoveg = txtSzam.Text;
int n = int.Parse(szoveg); // ha a szöveg "abc": FormatException; a hibakereső MEGÁLL ezen a soron
lblEredmeny.Text = (100 / n).ToString(); // ha n == 0: DivideByZeroException
}
Exception HelperHa a program kivételt dob (és nincs elkapva), a hibakereső megáll azon a soron, és felugró ablakban mutatja a kivétel típusát, üzenetét és okát (View Details). Ez sokkal informatívabb, mint a futtatható program kezeletlen kivétel-ablaka.
$exceptionA Watch vagy Locals ablakban a $exception a most keletkezett kivételre hivatkozik: $exception.Message, $exception.StackTrace, $exception.InnerException. Hasznos catch blokkban is (a kivétel változójával: ex).
Break When ThrownAz Exception Settings ablakban (Ctrl+Alt+E) beállíthatod, hogy a hibakereső már a dobáskor álljon meg, akkor is, ha egy try–catch elkapja. Így láthatod azokat a kivételeket is, amelyeket egy catch elnyel (és „elveszett” hibát okoz).
Elkapott kivételHa a catch blokkba töréspontot teszel, ott látod az ex értékeit. Az üres catch { } a legrosszabb hibaelhárítási akadály: elnyeli a kivételt, és semmit sem mutat (13.4 lecke).

Jósolj!

Egy try { Mentes(); } catch { } blokk elnyeli a mentési kivételt, és a felhasználó azt hiszi, hogy a mentés sikerült. Hogyan veszed észre hibakereséskor?

Jóslat ellenőrzése

Az Exception Settings ablakban a Common Language Runtime Exceptions mellett Break When Thrown: a hibakereső a dobás pillanatában megáll, és megmutatja a kivételt, bár a catch elnyelné. (Hosszú távon: a catch blokk naplózzon, vagy ne nyelje el.)

Hibakeresés módszeresen

A tudományos módszer

  1. Reprodukáld a hibát: pontos lépések, amelyek mindig előidézik.
  2. Szűkítsd a helyét: hol (melyik metódus) romlik el? Felező kereséssel.
  3. Állíts fel hipotézist: „az osszeg azért rossz, mert a ciklus eggyel korábban áll meg.”
  4. Teszteld a hipotézist (Watch, Immediate, értékmódosítás): megerősíti vagy cáfolja?
  5. Javíts egyet, és ellenőrizd. Ne módosíts egyszerre több dolgot.
  6. Ellenőrizd a határeseteket is, hogy új hiba nem keletkezett-e.

Szokások, amelyek segítenek

  • Olvasd el a hibaüzenetet és a stack trace-t, ne találgass.
  • Gumikacsa-módszer: magyarázd el a kódot hangosan (egy kacsának, egy barátnak): az elmondás közben gyakran kiderül a hiba.
  • Kicsinyíts: készíts minimális példát a hibára; így az ok kevés kódra szűkül.
  • Verziókezelés: mi változott, amióta még működött? (A git diff a legjobb barát.)
  • Szünet: a fáradt agy nem lát. Egy séta után gyakran „magától” megjön az ötlet.
  • Írd le a hibát és a megoldást: legközelebb gyorsabb.
Felező keresésEgy 100 soros folyamatban nem lépegetsz végig minden soron: a közepére töréspontot teszel, és megnézed, itt már rossz-e az érték. Ha igen, a hiba az első felében van, ha nem, a másodikban. 7 lépésből megvan a hely.
Ne bízz meg semmibenA hibakereső azt mutatja, mi van, nem azt, amit feltételezel. „Biztos jó a bemenet”: nézd meg a Locals-ban. A legtöbb hibát az a feltételezés okozza, amelyet nem ellenőriztek.
Egyszerre egy módosításHa egyszerre három dolgot változtatsz, és a hiba eltűnik, nem tudod, melyik oldotta meg (és melyik rontott el mást). Egy lépés, egy ellenőrzés.
Reprodukálhatatlan hibaHa a hiba nem mindig jelentkezik, keresd a változót: időzítés, véletlen, szálak (11. fejezet), külső adat. A naplózás (13.7 lecke) segít, ha a debugger nem reprodukálja.

Jósolj!

Három dolgot módosítasz egyszerre (a ciklus határát, egy feltételt és egy kezdőértéket), és a hiba eltűnik. Két nappal később újra előjön, más bemenetnél. Mi volt a hiba a módszerben?

Jóslat ellenőrzése

Hogy egyszerre többet változtattál: nem tudod, melyik módosítás oldotta meg a tényleges hibát, melyik csak elfedte a tünetet. Egy lépés, egy ellenőrzés, és mindig a hiba okát keresd, ne a tünetet.

📷 Képernyőkép helye

Mit tegyél ide: a Visual Studio hibakereső nézete: Locals, Watch, Immediate és Call Stack ablakok egy megállított programban.Javasolt fájlnév: winforms-13-3-ablakok.webp · Alt szöveg: A hibakereső ablakai

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. A Watch ablak „nem létezik” üzenetet ad

A osszeg mellett The name 'osszeg' does not exist in the current context látszik.

Ok és javítás

A változó nem abban a metódusban él, ahol a program áll: a hatókör (scope) eltér. A Call Stackben válts a megfelelő keretre, vagy a program a változó deklarálása előtt áll (még nem létezik).

2. A Locals értékei furcsák

Értelmetlen számok látszanak a változókon.

Ok és javítás

A változó értékét még nem állítottad be (a sor még nem futott le), vagy Release konfigurációban optimalizált. Lépj tovább egyet, és állítsd Debug-ra.

3. Az Immediate ablak megváltoztatta a programot

Kipróbáltál egy kifejezést, és a program másképp viselkedik.

Ok és javítás

A kifejezésnek mellékhatása volt (módosított adatot). Indítsd újra a programot, és csak olvasó kifejezéseket használj.

4. Nincs hívó a Call Stackben

Csak egy [External Code] sor áll a verem alján, és nem látod a hívót.

Ok és javítás

A hívó nem a te kódod (az eseményt a Windows Forms váltotta ki), ezért ez a belépési pont. A Show External Code opcióval megnézheted a keretrendszer részeit, de ritkán szükséges.

5. A kivétel nem a hibás sorban állt meg

A program egy távoli sorban dob kivételt, a hiba oka másutt van.

Ok és javítás

A Call Stackben menj felfelé a hívási láncon: a hibás érték valószínűleg egy korábbi metódusban keletkezett (például null, üres lista).

6. A catch elnyeli a hibát

try { Mentes(); } catch { }   // semmit sem mutat
Hiba és javítás

Állítsd be a Break When Thrown beállítást a kivétel megtalálásához, és a catch blokk naplózzon vagy jelezzen a felhasználónak (13.4 és 13.7 lecke).

Mini projekt: rejtélyes hibák a kosárban

Kapsz egy egyszerű webshop-kosár programot három rejtélyes hibával. A hibákat nem kitalálással, hanem a hibakereső eszközeivel találd meg: töréspont, Locals/Watch, Immediate, Call Stack:

  1. Projekt: Windows Forms (Kosar); txtNev, nudDb, btnHozzaad, btnDuplaz (az első tétel duplázása), btnOsszesit, lstKosar, lblOsszeg.
  2. Kód: másold be a hibás programot (lent); a Termek osztály külön fájlban vagy a Form alján.
  3. 1. rejtély: az első Hozzáad gombnyomásra a program összeomlik. Használd az Exception Helpert és a $exception értéket; döntsd el az okot és a javítást.
  4. 2. rejtély: az alma hozzáadása működik, az Alma (nagy kezdőbetű) nem. A Locals és az Immediate (? arak.ContainsKey(nev), ? arak.Keys) segítségével találd meg az okot.
  5. 3. rejtély: felvettél 2 db almát (120 Ft/db), majd a Duplázás után az összeg 240 + 480 = 720 Ft helyett 960 Ft lesz. A Locals Make Object ID funkciójával (jobb klikk az objektumon) vagy a ReferenceEquals kifejezéssel (? object.ReferenceEquals(kosar[0], kosar[1])) bizonyítsd be, mi történik.
  6. Call Stack gyakorlása: a Összesít gomb a btnOsszesit_Click → Kiir → Osszeg láncot hívja; az Osszeg belsejében tégy töréspontot, és a Call Stackben váltogass a keretek között: írd le, mi a kosar tartalma a Kiir keretében.
  7. Hipotézisnapló: minden hibához: tünet, hipotézis, mivel ellenőriztem (eszköz), eredmény, javítás.
  8. Javítás és ellenőrzés: javítsd a három hibát; ellenőrizd a példákkal: 2 alma + 1 körte = 2·120 + 200 = 440 Ft; a 2 almás tétel duplázása után egy új, 4 darabos almás sor kerül a kosárba: 440 + 4·120 = 920 Ft (a hibás programban a két sor ugyanaz az objektum, ezért az összeg 4·120 + 200 + 4·120 = 1160 Ft lenne).
A hibás program (próbáld ki előbb önállóan!)
Form1.cs (HIBÁS)C#
public class Termek
{
public string Nev;
public int Ar;
public int Db;
}

public partial class Form1 : Form
{
private List<Termek> kosar; // 1. rejtély
private Dictionary<string, int> arak = new Dictionary<string, int> { { "alma", 120 }, { "korte", 200 } };

private void btnHozzaad_Click(object sender, EventArgs e)
{
string nev = txtNev.Text;

kosar.Add(new Termek { Nev = nev, Ar = arak[nev], Db = (int)nudDb.Value }); // 1. és 2. rejtély
Kiir();
}

private void btnDuplaz_Click(object sender, EventArgs e)
{
Termek masolat = kosar[0]; // 3. rejtély

masolat.Db = masolat.Db * 2;
kosar.Add(masolat);
Kiir();
}

private void btnOsszesit_Click(object sender, EventArgs e) { Kiir(); }

private void Kiir()
{
lstKosar.Items.Clear();

foreach (Termek t in kosar) { lstKosar.Items.Add(t.Nev + " x " + t.Db + " = " + t.Ar * t.Db + " Ft"); }

lblOsszeg.Text = "Összesen: " + Osszeg() + " Ft";
}

private int Osszeg()
{
int osszeg = 0;

foreach (Termek t in kosar) { osszeg += t.Ar * t.Db; }

return osszeg;
}
}

Tippek (ha elakadsz): az 1. rejtély kivételének típusa NullReferenceException; a Locals-ban a kosar értéke null. A 2. a szótár kulcsainak kis-nagybetű érzékenysége. A 3. egy objektum, két hivatkozás (12.1 lecke).

A javított program
Form1.cs (JAVÍTVA)C#
public partial class Form1 : Form
{
private readonly List<Termek> kosar = new List<Termek>(); // 1. a lista létrehozva (a mező null volt)
private readonly Dictionary<string, int> arak = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase) { { "alma", 120 }, { "korte", 200 } }; // 2. kis-nagybetű nélküli kulcsok

private void btnHozzaad_Click(object sender, EventArgs e)
{
string nev = txtNev.Text.Trim();
int ar;

if (!arak.TryGetValue(nev, out ar)) { tsslUzenet.Text = "Ismeretlen termék: " + nev; return; } // 2. a hiányzó kulcs sem dob kivételt

kosar.Add(new Termek { Nev = nev, Ar = ar, Db = (int)nudDb.Value });
Kiir();
}

private void btnDuplaz_Click(object sender, EventArgs e)
{
if (kosar.Count == 0) { return; }

Termek eredeti = kosar[0];
Termek masolat = new Termek { Nev = eredeti.Nev, Ar = eredeti.Ar, Db = eredeti.Db * 2 }; // 3. valódi másolat: új objektum

kosar.Add(masolat);
Kiir();
}

private void btnOsszesit_Click(object sender, EventArgs e) { Kiir(); }

private void Kiir()
{
lstKosar.Items.Clear();

foreach (Termek t in kosar) { lstKosar.Items.Add(t.Nev + " x " + t.Db + " = " + t.Ar * t.Db + " Ft"); }

lblOsszeg.Text = "Összesen: " + Osszeg() + " Ft";
}

private int Osszeg()
{
int osszeg = 0;

foreach (Termek t in kosar) { osszeg += t.Ar * t.Db; }

return osszeg;
}
}
📷 Képernyőkép helye

Mit tegyél ide: a 3. rejtély a Locals ablakban (azonos Object ID a két listaelemnél).Javasolt fájlnév: winforms-13-3-rejtely.webp · Alt szöveg: Az azonos objektum két hivatkozása a Locals ablakban

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. Watch kifejezések

Egy ciklusban követned kell, hogy az osszeg túllépte-e a 100-at. Mit írsz a Watch ablakba?

Egy lehetséges megoldás

osszeg > 100 (logikai kifejezés); a Watch léptetés közben true/false értékre vált. Ugyanezt feltételes töréspontnak is beállíthatod.

2. Hívási lánc rajzolása

Egy saját programodban tégy töréspontot egy mélyen hívott metódusba, és rajzold le a Call Stacket.

Egy lehetséges megoldás

A rajzon: gomb → kezelő → metódus A → metódus B → metódus C; mindenhol az átadott paraméterek (a Locals-ból olvasva). A rajz tanulságos, hol romlott el az adat.

3. Immediate kísérlet

Az Immediate ablakban próbáld ki, hogyan viselkedik a Math.Round(2.5), a Math.Round(3.5) és a (int)2.9.

Egy lehetséges megoldás

A Math.Round(2.5) és a Math.Round(3.5) eredménye 2 és 4 (kerekítés a páros felé), az (int)2.9 2 (levágás). Ez magyarázza a „furcsa” kerekítéseket: MidpointRounding.AwayFromZero kell, ha a tanult szabályt várod.

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. Locals vagy Watch?

Mi a különbség?

Megoldás megnyitása

A Locals az aktuális metódus összes helyi változóját mutatja automatikusan; a Watch az általad megadott kifejezéseket figyeli.

2. Mi a Call Stack?

Fogalmazd meg egy mondatban.

Megoldás megnyitása

A metódushívások lánca a belépési ponttól az aktuális sorig; a legfelső az aktuális metódus.

Közepes szint

3. Immediate ablak

Mire használod, és mire kell vigyázni?

Megoldás megnyitása

Kifejezések kiértékelésére és kipróbálására megállított programban; a kifejezések valóban lefutnak (mellékhatás!).

4. Piros érték

Mit jelent a pirosra festett érték a Locals-ban?

Megoldás megnyitása

Az előző lépés óta megváltozott: segít látni, melyik sor mit módosított.

Kihívás szint

5. Ok vs. tünet

A kivétel egy metódusban keletkezik, a hiba oka a hívóban van. Hogyan találod meg?

Megoldás megnyitása

A Call Stackben duplán kattintasz a hívó keretre: a Locals a hívó állapotát mutatja, és látod, milyen hibás értéket adott át.

6. Felező keresés

A hiba egy 8 lépéses folyamat valamelyikében van. Legfeljebb hány töréspontos megállással találod meg?

Megoldás megnyitása

3 megállással (8 → 4 → 2 → 1): mindig a folyamat közepén ellenőrzöd, hogy az érték még jó-e.

Gyors önellenőrzés

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

1. Mit mutat a Locals?

Az aktuális metódus helyi változóit és paramétereit, értékkel.

2. Mire jó a Watch?

Általad megadott kifejezések értékeinek figyelésére léptetés közben.

3. Mire jó az Immediate ablak?

Kifejezések kiértékelésére és metódusok hívására megállított programban.

4. Mit mutat a Call Stack?

Hogy a program milyen hívási láncon jutott az aktuális sorhoz.

5. Mi az a $exception?

A frissen keletkezett kivételre hivatkozó pszeudó-változó a hibakeresőben.

6. Mi a hibakeresés tudományos módszere?

Reprodukálás, szűkítés, hipotézis, ellenőrzés, egy javítás, újra-ellenőrzés.

7. Mi a felező keresés?

Mindig a folyamat közepén ellenőrzöd az értéket, így gyorsan szűkíted a hiba helyét.

Mit tudsz már?

  • A Locals, Watch és Immediate ablakkal belenézel a megállított programba.
  • Olvasod a Call Stacket, és a keretek között váltva követed az adatot.
  • Kivételnél a hibakereső segítségével megtalálod az okot.
  • Módszeresen keresel hibát: hipotézis, megfigyelés, egy javítás.

Következő lecke: try, catch és finally

A futási hibák kezelése: a kivételek elkapása, a finally takarítás és a hibák felelős kezelése.