์ค๋ ์์
์๊ฐ์ ์๋ฐ์ Exception์ ๋ํด ๋ฐฐ์ ๋ค.
์์
์ ๋ฃ๊ณ ๋ค์ ๋ด์ฉ์ ์๋ฐ์ ์ ์์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํจ๊ป ๋ณด๋ฉด์ ์ ๋ฆฌ โ๏ธ
ํ๋ก๊ทธ๋จ ์ค๋ฅ ์ข ๋ฅ
- ์ปดํ์ผ ์๋ฌ - ์ปดํ์ผ ์์ ๋ฐ์ํ๋ ์๋ฌ
- ๋ฐํ์ ์๋ฌ - ์คํ ์์ ๋ฐ์ํ๋ ์๋ฌ
- ๋ ผ๋ฆฌ์ ์๋ฌ - ์คํ์ ๋์ง๋ง, ์๋์ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ฒ
ํ๋ก๊ทธ๋จ์์ ์คํ ๋์ค ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ ๋ คํด ์ด์ ๋ํ ์ ์ ํ ๋๋น๊ฐ ํ์ํ๋ค!
Error์ Exception์ ์ฐจ์ด?
Error
์ ํ๋ฆฌ์ผ์ด์
์ด ์ ์์ ์ผ๋ก ๋์ํ๋๋ฐ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
ex) ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ด๋ ์คํ์ค๋ฒํ๋ก์ฐ ๋ฑ
๊ฐ๋ฐ์๊ฐ Error๋ฅผ ์ฌ์ฉํ๋ ์ผ์ ๊ฑฐ์ ์๋ค๊ณ ํ๋ค.
Exception
๋น์ฆ๋์ค ๋ก์ง ์์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
๋ฐ์ํ๋๋ผ๋ ์์ต์ด ๊ฐ๋ฅํ์ฌ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด์ ๋ํ ์ ์ ํ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
์์ธ ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ
๋ชจ๋ Throwable์ ์์ํ๊ณ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์๋ถํฐ Error์ Exception์ด ๋ฐ์ํ๋ค.
์ฌ๊ธฐ์ ๋ชจ๋ ์์ธ์ ์กฐ์์ Exception ํด๋์ค์ด๋ค.
๋ ์์ธ ํด๋์ค๋ค์ ๋ ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋์ด ์ง ์ ์๋ค.
- RuntimeException ํด๋์ค์ ๊ทธ ์์ ํด๋์ค๋ค
- Exception ํด๋์ค์ ๊ทธ ์์ ํด๋์ค๋ค
์ด ๊ธ์์๋ RuntimeException ํด๋์ค์ ๊ทธ ์์ ํด๋์ค๋ค์ Checked Exception์ด๋ผ ํ๊ณ ,
Exception ํด๋์ค์ ๊ทธ ์์ ํด๋์ค๋ค์ Unchecked Exception์ด๋ผ๊ณ ํ๊ฒ ๋ค.
Checked Exception
import lotto.view.ErrorView;
public class CustomException extends Exception {
public CustomException() {
ErrorView.printErrorMessage();
}
}
โฆ
public class Application {
public static void main(String[] args) throws CustomException {
LottoNumber lottoNumber = LottoNumber.from(1);
}
}
Exception์ ์์๋ฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ปดํ์ผ ์์ ์ Exception์ ํ์ธํ ์ ์๋ค.
๋ง์ฝ ์ปดํ์ผ ์์ ์ Exception์ ๋ํ ์ฒ๋ฆฌ(try/catch)๋ฅผ ํ์ง ์์ ๊ฒฝ์ฐ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
Exception์ด ๋ฐ์ํ๋ ๋ฉ์๋์์ throws ์์ฝ์ด๋ฅผ ํ์ฉํด
Exception์ ํธ์ถ ๋ฉ์๋์ ์ ๋ฌํด์ผ ํ๋ค.
์์ ๋ฉ์๋๋ก throw๋ฅผ ๋์ง๋ ํ์๋ ์์ ๋ฉ์๋๋ค์ ์ฑ
์์ด ๊ทธ๋งํผ ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์,
๊ทธ๋ฆฌ ์ข์ ๋ฐฉ๋ฒ ๊ฐ์ง๋ ์๋ค.
Unchecked Exception
public class IllegalLottoNumberException extends IllegalArgumentException {
public IllegalLottoNumberException() {
ErrorView.printIllegalLottoNumberMessage();
}
}
โฆ
public class LottoNumber implements Comparable<LottoNumber> {
public static final int MIN_LOTTO_NUMBER = 1;
public static final int MAX_LOTTO_NUMBER = 45;
private static final Pattern NUMBER_PATTERN = Pattern.compile("^[0-9]*$");
private final int value;
public LottoNumber(String number) {
validateLottoNumber(number);
this.value = Integer.parseInt(number);
}
private void validateLottoNumber(String number) {
if (isBlank(number) || isInvalidNumberFormat(number) || isInvalidLottoNumberRange(number)) {
throw new IllegalLottoNumberException();
}
}
Runtime Time Exception ์ด๋ผ๊ณ ํ๋ค.
์ปดํ์ผ ์์ ์ Exception์ด ๋ฐ์ํ ๊ฒ์ธ์ง์ ์ฌ๋ถ๋ฅผ ํ๋จํ ์ ์๋ค.
Exception์ด ๋ฐ์ํ๋ ๋ฉ์๋์์ throws ์์ฝ์ด๋ฅผ ํ์ฉํด Exception์ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ง๋ง, ์ฒ๋ฆฌํด๋ ๋ฌด๋ฐฉํ๋ค.
Checked Exception VS Unchecked Exception
๊ตฌ๋ถ | Checked Exception | Unchecked Exception |
---|---|---|
ํ์ธ ์์ | ์ปดํ์ผํ์ | ๋ฐํ์ |
์ฒ๋ฆฌ | ๋ฐ๋์ ์์ธ ์ฒ๋ฆฌํด์ผ ํ๋ค. | throws๋ฅผ ํตํด ๊ทธ๋ฅ ๋์ ธ๋, ์ฒ๋ฆฌํด๋ ์๊ด ์๋ค. |
๋ํ ์์ธ | IOException, SQLException | IllegalArgumentException, NullPointEception |
๋๋ฌด ์น๋ช
์ ์ด๋ฉด Checked ์ฐ๊ณ ,
๊ตณ์ด ๊ฒฝ๊ณ ๊ฐ ํ์์๊ณ , ์๋น์ค ์ฝ๋๋ฅผ ๋ง๋๋ ์
์ฅ์ด๋ผ๋ฉด ์ต์๋จ์์
์๋ฌ๋ฅผ ํธ๋ค๋ง ํ ์ ์์ผ๋ Unchecked๋ฅผ ์ฐ๋๊ฒ ์ข๋ค.
์ฐธ๊ณ ๋ก ์ฝํ๋ฆฐ์์๋ Checked Exception์ ์ฝ๋๋ง ๋์ด๋ ๋ฟ์ด๋ผ ์๊ฐ(?)ํด์
์ฌ๋ฌ๊ฐ์ง ์ด์ ๋กโฆ Checked Exception์ด ์๋ค๊ณ ํ๋ค.
๋ ํ๋ก๊ทธ๋๋จธ ์
์ฅ์์ ๋ฉ์ธ๊ณผ ๊ฐ์ ์ค์์์ ํธ๋ค๋งํ๋ ๋
์์ ๋ง๋ค์ด ๊ด๋ฆฌํ๋๋ฐ,
๊ตณ์ด ์ฐ๋ฆฌ๊ฐ Checked Exception์ ์ ๊ณตํ ํ์๊ฐ ์๋๋ ๋ง์ด๋ค.
์์
์๊ฐ์ ๋ค์ํ ๋ง๋ค๋ก ๋์ ๊ตฌ๋ถ์ง์ด ๋ณด์๋๋ฐ,
**Checked Exception๋ **
- ๋ด๋ถ ๊ตฌํ์ด ์ด๋ป๊ฒ ๋๋์ง ์๋ ค์ฃผ๊ณ ์ถ์ด!
- ๋ด๊ฐ ์ง ์๋ฆฌํ ๊ฑด๋ฐ ์ ๋ค์น ์๋ ์์ผ๋๊น ๊ตฌ๊ธ์ฐจ ๋ฏธ๋ฆฌ ๋ถ๋ฌ!
- ๋ ์ง์ง ์กฐ์ฌํด์ผํด!
**Unchecked Exception๋ **
- ๋ด๋ถ์์ ์์ธ์ ๋ํ ๋ฐฉ์ด๊ฐ ์๋๋ฐ ํด๋ผ์ด์ธํธํํ ๊ณต๊ฐ๋ ์ํ ๊ฑฐ์ผ, ๋์ ๊ฐ์ ์ ๋ฃ์ด์ฃผ๋ฉด ์ข๊ฒ ์ด.
- ๋ด๊ฐ ์ง ์๋ฆฌํ ๊ฑด๋ฐ ์๋ ๋ค์น์ง ์๊ณ ์ ํ ์ ์์ด!
- ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ ฅํ ๊ฐ์ ์ ์๊ณ ์๊ฒ ์ง ~
์ด๋ฐ ๋๋์ผ๋ก ์ด์ผ๊ธฐ๊ฐ ๋์๋ค.
Checked์ธ์ง Unchecked์ธ์ง๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ผ๋ง๋ ์ฑ
์์ ๋ ๋๊ธฐ๋๋์ ๋ํ ๊ด์ ์ผ๋ก ๋ด๋ ์ข์ ๊ฒ ๊ฐ๋ค.
์์ธ ์ฒ๋ฆฌ - try-catch๋ฌธ
try {
// ์์ธ ๋ฐ์ ๊ฐ๋ฅ์ฑ ์๋ ๋ฌธ์ฅ๋ค
} catch (Exception1 e1){
// Exception1์ด ๋ฐ์ํ์ ๊ฒฝ์ฐ, ์ฒ๋ฆฌํ๋ ๋ฌธ์ฅ
} catch(Exception2 e2) {
// Exception2๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ, ์ฒ๋ฆฌํ๋ ๋ฌธ์ฅ
}
์ด๋ ๊ฒ ํ๋์ try ๋ธ๋ญ ๋ค์์๋ ์ฌ๋ฌ ์ข
๋ฅ์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก
ํ๋ ์ด์์ catch ๋ธ๋ญ์ด ์ฌ ์ ์๋ค.
ํ๋ฆ
try ๋ธ๋ญ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, ์์ธ๊ฐ ๋ฐ์ํ ์์น ์ดํ์ ์๋
try ๋ธ๋ญ์ ๋ฌธ์ฅ๋ค์ ์ํ๋์ง ์๋๋ค.
๋๋ฌธ์ try ๋ธ๋ญ์ ํฌํจ์ํฌ ์ฝ๋์ ๋ฒ์๋ฅผ ์ ์ ํํด์ผ ํ๋ค.
์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋ฐ์ํ ์์ธ์ ํด๋นํ๋ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋ค.
try๋ธ๋ญ์์ ์์ธ๊ฐ ๋ฐ์๋๊ณ , ์ฒซ catch ๋ฌธ๋ถํฐ ์ฐจ๋ก๋๋ก catch ๋ธ๋ญ์
๊ดํธ ๋ด ์ ์ธ๋ ์ฐธ์กฐ๋ณ์์ ์ข
๋ฅ์ ์์ฑ๋ ์์ธ ํด๋์ค์ ์ธ์คํด์ค์ instanceof
์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๊ฒ์ฌํ๋ค.
๊ฒ์ฌํ ๊ฒฐ๊ณผ๊ฐ true์ธ ๋ธ๋ญ์ ๋ง๋ ๋ ๊น์ง ๊ณ์ ๊ฒ์ฌํ๋ค.
try์์ ๋ฐ์ํ ์์ธ์ ์ข ๋ฅ์ ์ผ์นํ๋ ๋จ ํ๋์ catch ๋ธ๋ญ๋ง ์ํ๋๋ค.
public class LottoNumber {
private final int number;
private LottoNumber(int number) {
this.number = number;
}
public static LottoNumber from(final int number) throws CustomException {
throw new CustomException();
}
}
๋ค์๊ณผ ๊ฐ์ด LottoNumber ๊ฐ์ฒด๋ฅผ from()
์ผ๋ก ์์ฑํ์ ๋
Exception
์ ์์๋ฐ๊ณ ์๋ CustomException
์ ๋ฐ์์ํจ๋ค๊ณ ํด๋ณด์.
์ธํ
๋ฆฌ์ ์ด์์๋ ์ ์ ์๋ฏ์ด CustomException
์ ์์ ํด๋์ค์ธ
Exception
์ ๋ฏธ๋ฆฌ catchํด์ฃผ์๊ธฐ ๋๋ฌธ์ ํ์ catch์์
CustomException
๋ฅผ ์ก๋ ๊ฒ์ ์์ฉ์ด ์๋ค.
๋ชจ๋ ์์ธ ํด๋์ค๋ Exception ํด๋์ค์ ์์์ด๋ฏ๋ก,
Exception ํด๋์ค ํ์
์ ์ฐธ์กฐ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ํด๋น ๋ธ๋ญ์์ ์ด๋ค ์์ธ๋์ง ์ฒ๋ฆฌ๋๋ค.
๋ ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์คํ์์ผ๋ณด๋ฉด ์๋์ ๊ฐ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
๋ฉํฐ catch ๋ธ๋ญ
JDK1.7๋ถํฐ catch ๋ธ๋ญ์ |
์ ์ด์ฉํด ํ๋์ catch ์ ๋ญ์ผ๋ก ํฉ์น ์ ์๊ฒ ๋์๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ๋ถ๋ชจ ์์ ๊ด๊ณ๊ฐ ์๋ค๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ค์ฒฉ๋ try-catch
ํ๋์ ๋ฉ์๋ ์์ ์ฌ๋ฌ๊ฐ์ try-catch๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ,
์ค์ฒฉ์ผ๋ก๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง catch๋ธ๋ญ ๊ดํธ ๋ด ์ฐธ์กฐ ๋ณ์๋ catch ๋ธ๋ญ ๋ด์์ ์ ํจํ๋ฐ,
์์ ์์ ์์๋ e
์ ์ฐธ์กฐ๋ณ์์ ์์ญ์ด ์๋ก ๊ฒน์น๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค.
Custom Exception
๊ธฐ์กด์ ์ ์๋ ์์ธ ํด๋์ค ์ธ์ ํ์์ ๋ฐ๋ผ ์ฌ์ฉ์ ์ ์ ํด๋์ค๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
class MyException extends Exception {
MyException(String msg) {
super(msg);
}
}
์์ฑ์ string์ ์ธ์๋ก ๋ฐ์์ ๋ฉ์์ง๋ก ์ ์ฅํ ์ ์๋ค.