Rzucanie wyjątków

0

Witam,

Zmagam się z poniższym zadaniem:
user image

Według mnie rozwiązanie powinno być następujące:

a) Po złapaniu wyjątku z klasy Ex2 tzn (Ex2 e), program wypisze na konsoli System.out.println("Ex2") oraz blok finally "Got it!". Reszta wyjątków zostanie pominięta w wykonaniu.
b) Po złapaniu wyjątku z klasy Ex1 tzn (Ex1 e), program wypisze na konsoli System.out.println("Ex1") oraz blok finally "Got it!". Reszta wyjątków zostanie pominięta w wykonaniu.
c) Po złapaniu wyjatku z klasy IllegalArgumentException program wypisze blok finally "Got it!".

Autor zadania mówiąc podklasa miał na myśli coś takiego? Nie wiem czy podklasa oznacza klasa rozszerzająca tzn (extends).

public class Exception {

	public class Ex1 extends Exception {
		public class Ex2 extends Exception {

		}
	}

}

czy ?

public class Exception {

	public class Ex1 {
		public class Ex2 {

		}
	}

}
0

Coś mi tu nie pasi. Skoro E2 nie jest klasą dziedziczącą po RuntimeException to nie musi być złapana przypadkiem?
A poza tym widać że w ogóle nie masz pojęcia o programowaniu obiektowym w Javie :D

0

Niestety mam takie zadania, nie wiem za bardzo jak to ubrać w gotowy kod aby wykonanie powiodło się w programie Eclipse. Mógłbyś dokładnie wyjaśnić swoje rozwiązanie?

2

Po pierwsze jest tak:

 
public class Ex1 extends Exception{
...
}

public class Ex2 extends Ex1{
...
}


Są to oddzielne pliki (no chyba że ew. klasy statyczne ale raczej nie)
Po 2 to zakładając że metoda w której jest ten kod albo wyrzuca wyjątki albo ten fragment kodu jest gdzieś w try catch to stanie się tak jak pisałeś.
Po 3 nie eclipse tylko Intellij

0

Dzięki za odpowiedz, nie wiem czemu twierdzisz że nie mam pojęcia skoro chociaż cząstkę zrobiłem dobrze, każdy kiedyś się uczy ;)

Mam jeszcze pytanie gdyby blok złapał wyjątek: (Exception e) wykona się się System.out.println("Exception here") kolejno zostanie rzucony nowy wyjątek Ex2 czyli System.out.println("Ex2") oraz wykona się blok finally.

1

a) złapie go drugi catch, a potem wypisze na konsoli to co w finally
b) złapie go pierwszy catch, a potem wypisze na konsoli to co w finally
c) złapie go trzeci catch jeżeli Exception, o który chodziło autorowi to

java.lang.Exception

, wypluje na konsole, rzuci e2, wykona się blok finally

@Nitro95

czyli System.out.println("Ex2") oraz wykona się blok finally.

Nie wykona się, ponieważ klauza throws łapiąca (Exception e) jest zadeklarowana niżej niż Ex2, zatem żeby to zadziało albo musi być to zadeklarowane w sygnaturze metody wykonującej ten fragment kodu, ale złapane osobną klauzulą

nie wiem czy dobrze zrozumiałem intencję autora zadania, bo to jakieś ewidentne bohomazy

public class TestExceptions {

	public static void main(String[] args) {
		try {
			try {
				elo();
				// elo2();
				elo3();
			} catch (Ex2 e) {
				System.out.println("Ex2");
			} catch (Ex1 e) {
				System.out.println("Ex1");
			}

			catch (Exception e) {
				System.out.println("exception here");
				throw new Ex2();
			} finally {
				System.out.println("got it");
			}

		} catch (Ex2 e) {
			e.printStackTrace();
		}
	}

	public static class Ex1 extends Exception {
	}

	public static class Ex2 extends Ex1 {
	}

	public static void elo() throws Ex1 {
		// throw new Ex1();
	}

	public static void elo2() throws Ex2 {
		throw new Ex2();
	}

	public static void elo3() throws IllegalArgumentException {
		throw new IllegalArgumentException();
	}
}
1

W zaproponowanym kodzie nic się nie stanie bo kod
try{.... //some code}

się nie skompiluje. Kompilator wyrzuci syntax error, gdyż "..." nie jest poprawną konstrukcją języka.

0

Takich kodów wykładowca raczej nie daje, takie oznaczenia to standard u tej osoby :)

Mam kolejny przypadek:

Wyjaśnij jak będzie działał następujący fragment kodu:

 
try{...//execute code
} catch (Ex1 e) {
System.out.println("Ex1");
throw new Ex1();
}catch (Ex2 e) {
System.out.println("Ex2);
}

Przerobiłem kod pod ten przykład w następujący sposób:

public class TestExceptions {

	public static void main(String[] args) {
		try {
			try {

				elo();
				elo2();

			} catch (Ex1 e) {
				System.out.println("Ex1");
				throw new Ex1();
			} catch (Ex2 e) {
				System.out.println("Ex2");

			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static class Ex1 extends Ex2 {

	}

	public static void elo() throws Ex1 {
		throw new Ex1();
	}

	public static void elo2() throws Ex2 {
		throw new Ex2();
	}

}

wynik działania:

 
Ex1
TestExceptions$Ex1
	at TestExceptions.main(TestExceptions.java:15)

komentarz:
Pierwszy blok catch wypisze "Ex1" i rzuci nowy wyjątek (throw new Ex1()); który zwróci błąd: TestExceptions.main, drugi blok catch nie wykona się.

0

To zależy czy jest tam jakaś hierarchia pomiędzy Ex1 i Ex2 bo jeśli class Ex1 extends Ex2 to drugi catch też zadziała.

0

Tylko stosując się do polecenia które było na pierwszej stronie odnośnie tego przypadku, kompilator nie pozwala zastosować jednej linijki: (oznaczyłem ją: //*BŁĄD)


public class TestExceptions {

	public static void main(String[] args) {
		try {
			try {

				elo();
				elo2();

			} catch (Ex1 e) {
				System.out.println("Ex1");
				throw new Ex1();
			} catch (Ex2 e) {   //**BŁĄD*
				System.out.println("Ex2");

			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

    public static class Ex1 extends Exception {
    }
    
	public static class Ex2 extends Ex1 {

	}

	public static void elo() throws Ex1 {
		throw new Ex1();
	}

	public static void elo2() throws Ex2 {
		throw new Ex2();
	}

}

@Shalom
Jeśli Ex1 extends Ex2 to kompliator zwraca:
Ex1
TestExceptions$Ex1
at TestExceptions.main(TestExceptions.java:13)


public class TestExceptions {

	public static void main(String[] args) {
		try {
			try {

				elo();
				elo2();

			} catch (Ex1 e) {
				System.out.println("Ex1");
				throw new Ex1();
			} catch (Ex2 e) {
				System.out.println("Ex2");

			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 
	public static class Ex1 extends Ex2 {

	}

	public static void elo() throws Ex1 {
		throw new Ex1();
	}

	public static void elo2() throws Ex2 {
		throw new Ex2();
	}

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1