Możesz zarządzać wyjątkiem w ramach metody, używając do tego try
i catch
. W takim przypadku nie trzeba używać throws
. Na przykład:
public void myMethod()
{
try {
/* Code that might throw an exception */
}
catch (SpaceInvadersException exception) {
/* Complicated error handling code */
}
}
Ale załóżmy, że miał tysiąc sposobów, z których każdy może rzucić SpaceInvadersException
. Wtedy musiałbyś napisać cały skomplikowany kod obsługi błędów tysiąc razy. Oczywiście zawsze można utworzyć klasę ErrorHandler
za pomocą metody dealWithSpaceInvadersException()
, którą można wywołać z nich, ale nadal utkniesz z tysiącami bloków try
- .
Zamiast tego mówisz kompilatorowi, że każda z tych tysięcy metod może rzucić SpaceInvadersException
.Następnie każda metoda, która wywołuje jedną z tych metod, musi poradzić sobie z samym błędem, używając albo try
- catch
, albo mówiąc kompilatorowi, że może on rzucić SpaceInvadersException
. Odbywa się to za pomocą słowa kluczowego throws
, tak:
public void myMethod() throws SpaceInvadersException
{
/* Code that might throw an exception */
}
public void callingMethod()
{
try {
myMethod();
}
catch (SpaceInvadersException exception) {
/* Complicated error handling code */
}
}
W takim przypadku należy poinformować kompilator, że myMethod
mógł rzucać SpaceInvadersException
. Oznacza to, że nie można wywołać tej metody, nie traktując w jakiś sposób wyjątku (try
- catch
lub używając słowa kluczowego throws
w metodzie wywołującej). Jeśli nie ma tam wartości throws
, można wywołać tę metodę bez wykonywania obsługi wyjątków i uzyskać wyjątek, który nie był nigdzie w programie (co byłoby złe).
Ponieważ zawsze lepiej jest unikać powielania kodu, zwykle lepiej jest zdjąć obsługę błędów, aby uzyskać funkcję o wiele wyższym poziomie niż w przypadku osobnego traktowania we wszystkich metodach niskiego poziomu . Właśnie dlatego ten mechanizm istnieje.
Java używa rzuca klauzuli poinformować kompilator, że metoda ta może rzucić wyjątek jest poprawna. Ale ostrzega również dzwoniącego o szczególnym wyjątku, który może wystąpić w wywołaniu tej metody. A zatem wywołujący metodę może w oparciu o to podjąć pewne kroki. –