CodeGym /Cursuri /Sintaxa Java /Introducerea de excepții

Introducerea de excepții

Sintaxa Java
Nivel , Lecţie
Disponibil

"Bună, Amigo. Vom avea o lecție foarte interesantă astăzi. Vă voi spune despre excepții. Excepțiile sunt un mecanism special care ne permite să gestionăm erorile din program. Iată câteva exemple de erori care ar putea apărea intr-un program:

1. Programul poate încerca să scrie un fișier când hard disk-ul este complet plin.

2. Programul poate încerca să apeleze o metodă pe o variabilă care stochează o referință nulă.

3. Programul poate încerca să împartă un număr la 0.”

Toate aceste acțiuni duc la erori. De obicei, rezultatul este că programul se termină imediat, deoarece nu are sens să continue executarea codului în acest caz.

"De ce?"

„Are sens să continui să învârți o roată dacă mașina a ieșit de pe șosea și cade de pe o stâncă?”

„Atunci, programul ar trebui să se oprească?”

"Da. Cel puțin, asta se întâmpla înainte. Orice eroare a cauzat terminarea programului."

„Este o abordare foarte inteligentă”.

„Dar nu ar fi mai bine să încercăm și să continui să rulezi programul?”

„Da. Să presupunem că ai introdus o cantitate mare de text în Word și ai salvat-o. Ce se întâmplă dacă operația de salvare eșuează, dar programul te face să crezi că totul este în regulă? Și continui să tastezi. Ar fi o prostie, nu-i așa? aceasta?"

"Da."

"Atunci programatorii au venit cu o soluție interesantă: fiecare funcție ar returna starea muncii sale. 0 însemna că funcționează conform așteptărilor. Orice altă valoare ar însemna că a apărut o eroare, iar valoarea returnată a fost un cod de eroare."

„Cu toate acestea, această abordare are și deficiențele sale. După fiecare apel de funcție (!), trebuie să verificați codul de retur (numărul). În primul rând, acest lucru este incomod: codul de tratare a erorilor este rar executat, dar trebuie inclus peste tot. În al doilea rând, funcțiile returnează adesea valori diferite – ce ar trebui să faci cu ele?"

— Corect. M-am gândit și la asta.

„Atunci, a sosit un viitor strălucit sub forma excepțiilor și a unui mecanism de gestionare a erorilor. Iată cum funcționează:

1. Când apare o eroare, Java Machine creează un obiect special – o excepție – unde salvează toate informațiile despre eroare. Există diferite excepții pentru diferite erori.

2. O excepție face ca programul să iasă imediat din funcția curentă și din următoarea funcție și așa mai departe – până când iese din metoda principală. Apoi programul se termină. Programatorii pot spune, de asemenea, că Java Machine „desfășoară stiva de apeluri”.

— Dar ai spus că programul nu se termină întotdeauna.

"Da, pentru că există o modalitate de a prinde o excepție. Putem scrie cod special în locul potrivit pentru a prinde excepțiile la care ne pasă și pentru a face ceva cu ele. Acestea sunt lucruri importante."

„Pentru a ne ajuta să facem acest lucru, există o construcție specială try-catch . Iată cum funcționează:”

Exemplu de program care prinde o excepție (împărțire cu 0) și continuă să funcționeze.
public class ExceptionExample2
{
    public static void main(String[] args)
    {
        System.out.println("Program starts");

        try
        {
            System.out.println("Before calling method1");
            method1();
            System.out.println("After calling method1. This will never be shown");
        }
        catch (Exception e)
        {
           System.out.println("Exception has been caught");
        }

        System.out.println("Program is still running");
    }

    public static void method1()
    {
        int a = 100;
        int b = 0;
        System.out.println(a / b);
    }
}
Ieșire ecran:

Program starts
Before method1 calling
Exception has been caught
Program is still running

„Dar de ce nu va fi afișat pe ecran „După apelarea metodei 1. Aceasta nu va fi afișată niciodată”?”

"Mă bucur că ai întrebat. În rândul 25, împărțim la 0, ceea ce duce la o eroare - o excepție. Mașina Java creează un obiect ArithmeticException cu informații despre eroare. Obiectul este excepția."

"Excepția are loc în interiorul method1metodei. Acest lucru face ca metoda să se termine imediat. Ar face ca metoda principală să se termine dacă nu ar fi blocul try-catch ."

„Dacă apare o excepție în interiorul unui bloc try, aceasta este prinsă în blocul catch . Restul codului din blocul try nu va fi executat. În schimb, blocul catch va începe să fie executat.

"Nu înţeleg."

„Cu alte cuvinte, codul funcționează astfel:

1. Dacă apare o excepție în interiorul unui bloc try , codul încetează să mai fie executat acolo unde a apărut excepția și blocul catch începe să fie executat.

2. Dacă nu apare nicio excepție, atunci blocul try este executat până la sfârșit , iar blocul catch nu este executat. "

"Huh?"

„Imaginați-vă că după fiecare apel de metodă verificăm dacă metoda a revenit normal sau a fost întreruptă brusc ca urmare a unei excepții. Dacă există o excepție, atunci trecem la executarea blocului catch (dacă există) pentru a prinde excepția. Dacă nu există un bloc de captură, atunci vom termina metoda curentă, iar metoda care ne-a chemat efectuează aceeași verificare."

— Cred că l-am prins acum.

"Excelent."

„Ce înseamnă „Excepție” în interiorul declarației catch?”

" Toate excepțiile sunt clase care moștenesc clasa Exception. Putem prinde o anumită excepție prin specificarea clasei de excepție în blocul catch , sau putem prinde toate excepțiile specificând clasa lor părinte comună – Excepție. Apoi putem obține toată eroarea necesară informații din variabila e (stochează o referință la obiectul excepție)."

"Mis! Dacă în metoda mea apar diferite excepții, atunci pot să le procesez diferit?"

„Nu numai că poți, dar și tu ar trebui. Poți face asta astfel:”

Exemplu:
public class ExceptionExample2
{
    public static void main(String[] args)
    {
        System.out.println("Program starts");

        try
        {
            System.out.println("Before calling method1");
            method1();
            System.out.println("After calling method1. This will never be shown");
        }
        catch (NullPointerException e)
        {
           System.out.println("Null reference. Exception has been caught");
        }
        catch (ArithmeticException e)
        {
            System.out.println("Division by zero. Exception has been caught");
        }
        catch (Exception e)
        {
            System.out.println("Any other errors. Exception has been caught");
        }

        System.out.println("Program is still running");
    }

    public static void method1()
    {
        int a = 100;
        int b = 0;
        System.out.println(a / b);
    }
}

„ Blocul try poate fi asociat cu mai multe blocuri catch , fiecare dintre ele va prinde tipurile specificate de excepții.”

"Cred că înțeleg. Nu pot să scriu asta încă, dar dacă dau peste el în cod, nu mă voi speria."

Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION