Inne działy

Java przykładowe programy

 

Java Stack Trace (stos)

 

W normalnym przepływie programu, gdy Java Virtual Machine jest uruchomiona, metody są wykonywane jedna po drugiej, począwszy od metody głównej. Kiedy metoda ma być wykonana przesuwa się na szczyt kolejki programowania i znajduje się górze stosu. Gdy metoda zostanie wykonana, zostaje zdjęta ze stosu, aby być zastąpioną przez następną metodę w kolejce. Aby zilustrować to, zmień swój kodu programu na:

 

package naukabledy;


public class NaukaBledy {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        System.out.println("Start metody Main");
        metoda1();
        System.out.println("Koniec metody Main");
    }
    
    static void metoda1(){
        System.out.println("Metoda pierszwa metoda1");
        metoda2();
    }
    
    static void metoda2(){
        System.out.println("Metoda druga metoda2");
    }    
}

Mamy teraz metodę Main i dwie inne: metoda nazwana metoda1 i metoda nazwana metoda2 . Podczas pierwszego urochomienia programu, metoda główna Main jest na górze stosu. Jednak wewnątrz metody Main mamy wywołanie metody metoda1. Kiedy ta metoda jest wywoływana przesuwa się na górę stosu. Metoda metoda1 z kolei wywołuje metodę metoda2. Kiedy metoda2 jest wywoływana, przechodzi na górę stosu, przesuwając metoda1 czasowo na bok. Kiedy metoda2 kończy swoje działanie, sterowanie jest przekazywane z powrotem do metoda1. Gdy metoda1 kończy działanie, to zostanie zepchnięta ze szczytu stosu, a sterowanie jest zwracane do metody Main.

Uruchom program i oglądaj okno Output, aby zobaczyć, co zostanie wyświetlone:

 

run:

Start metody Main

Metoda pierszwa metoda1

Metoda druga metoda2

Koniec metody Main

BUILD SUCCESSFUL (total time: 0 seconds)

 

Jeśli coś pójdzie nie tak w metodzie metoda2, JVM będzie szukać jakiejkolwiek obsługi błędów, jak blokutry ... catch. Jeśli nie ma obsługi błędów, Wyjątek będzie przekazany do metoda1, aby zobaczyć, czy ma do czynienia z błędem. Jeśli nie mamy żadnych błędów obsługi w metoda1 Exception (Wyjątek) zostanie przeniesiony na stos, tym razem do metody Main. Jeśli metoda główna nie ma obsługi wyjątku dostaniesz dziwny komunikat wyświetlony w oknie Output. Jako przykład, dostosuj kod metoda2 jak poniżej:

static void m2( ) {

int x = 10;
int y = 0;
double z = x / y;

System.out.println( z );
System.out.println("Method Two - m2");

}

Metoda zawiera ponownie błąd dzielenia przez zero. Kod powinien wyglądać jak poniżej: 

 

package naukabledy;


public class NaukaBledy {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        System.out.println("Start metody Main");
        metoda1();
        System.out.println("Koniec metody Main");
    }
    
    static void metoda1(){
        System.out.println("Metoda pierszwa metoda1");
        metoda2();
    }
    
    static void metoda2(){
        int x = 10;
        int y = 0;
        double z = x/y;
        
        System.out.println(z);
        System.out.println("Metoda druga metoda2");
    }    
}

Uruchom program i zobacz, co dzieje się w oknie Output:

 

run:

Start metody Main

Metoda pierszwa metoda1

Exception in thread "main" java.lang.ArithmeticException: / by zero

            at naukabledy.NaukaBledy.metoda2(NaukaBledy.java:24)

            at naukabledy.NaukaBledy.metoda1(NaukaBledy.java:18)

            at naukabledy.NaukaBledy.main(NaukaBledy.java:12)

Java Result: 1

BUILD SUCCESSFUL (total time: 0 seconds)

 

To co widzisz w oknie Output to coś takiego jak ślad stosu. Trzy linie zaczynające się od liter at odnoszą się do swoich metod i informują gdzie można je znaleźć:

package_nazwa.klasa_nazwa.metoda_nazwa

Pierwszy błąd wystąpił, w metoda2 . Java szukała procedury obsługi błędu przez obiekt ArithmeticException, czyli tam, gdzie wystąpił błąd dzielenia przez zero, który należało złapać. Nie było obsługi błędów w metoda2, metoda1 i w metodzie głównej Main. Więc program musiał skorzystać z domyślnej obsługi błędów.

Zmienić można kod metody metoda1:

try {
System.out.println("Method One - m1");
m2( );
}
catch (ArithmeticException err) {
System.out.println( err.getMessage( ) );
}

Mamy teraz wywołanie metody metoda2 w części try bloku try … catch. W części catch, używaliśmy typu wyjątku, który został zgłoszony w śladzie stosu - ArithmeticException.

Uruchom kod ponownie i okno wyjściowe wyświetli następującą informację:

 

run:

Start metody Main

Metoda pierszwa metoda1

/ by zero

Koniec metody Main

BUILD SUCCESSFUL (total time: 1 second)

 

Zauważ, że komunikat o błędzie jest wyświetlany: "/ by zero". Kod metody metoda2 nie został wykonany, ale został zatrzymany w miejscu, w którym wystąpił błąd. Kontrola została następnie przekazana z powrotem do metoda1. Ponieważ był blok catch do obsługi błędu, JVM nie widział potrzeby przekazać sterowanie programu do domyślnej obsługi błędów, ale wyświetlił komunikat zawarty między nawiasami instrukcji catch.

Sam program nie został jednak zatrzymany. Kontrola została przekazana z powrotem do metody Main, gdzie została wywołana metoda metoda1. Ostatni wiersz w metodzie Main, wyśietlający komunikat "Koniec metody Main", został stracony. Ma to istotne konsekwencje. Załóżmy, że potrzebna jest wartość z metoda1, bo zamierzaliśmy ją wykorzystać w metodzie głównej Main. Wartości nie będzie tam, a twój program może nie działać zgodnie z oczekiwaniami.

 

W następnej części przyjrzymy się błędą logicznym.

 

Zobacz nasze wszystkie kursy

WWW


HTML
HTML - Znaczniki
CSS - Tutorial
CSS - Selektory
PHP
JavaScript

XML

XSLT

Bazy danych


SQL
SQLite
MySQL
PostgreSQL

 

 

Programowanie


C
C++
C#
Java
VisualBasic
Python

Linux


Podstawy Linuxa
Bash
Linuks artykuły

Windows


Excel funkcje
Windows wskazówki
Outlook

Pozotałe działy


Programy
Rozrywka

 

 

 

This email address is being protected from spambots. You need JavaScript enabled to view it.