π μμΈ (Exception)
π μμΈ μ²λ¦¬
π κ΄λ ¨ μμ
μνμ μΌλ‘ λΆλͺ¨(λλλ μ)λ 0μ΄ λ μ μλλ° μ¬μ©μκ° 0μ μ λ ₯νμ κ²½μ° μμΈκ° λ°μνλ€.
μμΈ λ°μ μκ°μ νλ‘κ·Έλ¨μ΄ μ’
λ£λλ€.
β‘ κ°μλ¨Έμ μ μμΈκ° λ°μνλ©΄ κ·Έ λ΄μ©μ κ°λ¨ν μΆλ ₯νκ³ νλ‘κ·Έλ¨μ μ’
λ£ν΄λ²λ¦°λ€.
λν μ¬μ©μκ° μ«μκ° μλ λ¬Έμλ₯Ό μ
λ ₯νμ κ²½μ°μλ μμΈκ° λ°μνλ€.
import java.util.Scanner;
public class ExceptionCase {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
System.out.print("a/b...aμ κ°μ μ
λ ₯νμΈμ: "); // λΆμ μ
λ ₯
int a = kb.nextInt(); // intν μ μ μ
λ ₯
System.out.print("a/b...bμ κ°μ μ
λ ₯νμΈμ: "); // λΆλͺ¨ μ
λ ₯
int b = kb.nextInt(); // intν μ μ μ
λ ₯
System.out.printf("%d/%d = %d \n", a, b, a/b);
System.out.println("νλ‘κ·Έλ¨ μ’
λ£!");
}
}
// μ€ν κ²°κ³Ό
a/b...aμ κ°μ μ
λ ₯νμΈμ: 5
a/b...bμ κ°μ μ
λ ₯νμΈμ: 0
// λΆλͺ¨κ° 0μΌ κ²½μ° μμΈμν©μ΄ λ°μν΄ νλ‘κ·Έλ¨μ΄ μ’
λ£λ¨μ νμΈ ν μ μλ€.
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ch18.ExceptionCase.main(ExceptionCase.java:18)
(try ~ catch)π μμΈ ν΄λμ€
ArithmeticExceptionInputMismatchExceptionπ μμΈ μ²λ¦¬
μμΈλ₯Ό μ²λ¦¬ν λλ try ~ catchλ¬Έμ μ¬μ©νλ€.
β‘ μμΈ μ²λ¦¬λ₯Ό μν μ½λλ₯Ό λ³λλ‘ κ΅¬λΆνκΈ° μν΄ λμμΈλ μμΈμ²λ¦¬ λ©μ»€λμ¦μ΄ try ~ catchλ¬Έμ΄λ€.
try ~ catchλ¬Έμ try μμκ³Ό catch μμμΌλ‘ ꡬλΆλλλ°,
μ΄ λμ νλμ λ¬Έμ₯μ΄λ―λ‘ νμ μ°κ²°λμ΄ μμ΄μΌ νλ€.
try μμμμ λ°μν μμΈ μν©μ catch μμμμ μ²λ¦¬νλ λ°©μμΌλ‘ λμνλ€.
try ~ catchλ¬Έμ μ±λ₯μ νλ₯Ό μΌμΌν¬ μ μλ€.
// try ~ catch문 기본 ꡬ쑰
try {
...κ΄μ°° μμ...
}
catch(Exception e) {
...μ²λ¦¬ μμ...
}
μμΈκ° λ°μνλ©΄ μλ° κ°μλ¨Έμ μ μμΈ μΈμ€ν΄μ€λ₯Ό λ§λ€κ³ , λ§λ€μ΄μ§ μμΈ μΈμ€ν΄μ€μ μ°Έμ‘°κ°μ΄ catchμ λ§€κ°λ³μ μ μΈμ ν΅ν΄ μ λ¬λλ€.
λ°λΌμ catchμ λ§€κ°λ³μ μ μΈ νμ
μ΄ μμΈ μΈμ€ν΄μ€μ νμ
κ³Ό λμΌν΄μΌ νλ€.
catchλ¬Έμ λ μ΄μ μ°μ΄μ΄ μΈ μ μλ€.
try {
...κ΄μ°° μμ...
}
// ArithmeticException μμΈν΄λμ€ν μ°Έμ‘°λ³μκ° ArithmeticExceptionν μμΈ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°
catch(ArithmeticException e) {
...μ²λ¦¬ μμ...
}
// InputMismatchException μμΈν΄λμ€ν μ°Έμ‘°λ³μκ° InputMismatchExceptionν μμΈ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°
catch(InputMismatchException e) {
...μ²λ¦¬ μμ...
}
π κ΄λ ¨ μμ
import java.util.Scanner;
public class ExceptionCase2 {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
try {
System.out.print("a/b...aμ κ°μ μ
λ ₯νμΈμ: ");
int a = kb.nextInt();
System.out.print("a/b...bμ κ°μ μ
λ ₯νμΈμ: ");
int b = kb.nextInt();
System.out.printf("%d/%d = %d /n", a, b, a/b); // μμΈ λ°μ μ§μ
}
catch(ArithmeticException e) {
System.out.println(e.getMessage()); // μμΈμ μμΈμ λ΄κ³ μλ λ¬Έμμ΄μ λ°ν
}
System.out.println("νλ‘κ·Έλ¨ μ’
λ£!");
}
}
// μ€ν κ²°κ³Ό
a/b...aμ κ°μ μ
λ ₯νμΈμ: 5
a/b...bμ κ°μ μ
λ ₯νμΈμ: 0
/ by zero
νλ‘κ·Έλ¨ μ’
λ£!
0μΈ μνμμ λλμ
μ μ§ννλ μκ° μμΈκ° λ°μνλ€.ArithmeticException μΈμ€ν΄μ€λ₯Ό μμ±νλ€.tryμμμ μ΄μ΄μ λ±μ₯νλ catchμμμμ μμ±ν μΈμ€ν΄μ€λ₯Ό μΈμλ‘ λ°μ μ μλ μ§ νμΈνκ³ , λ°μμ μμΌλ©΄ catchμμμΌλ‘ μΈμ€ν΄μ€λ₯Ό μ λ¬νλ€.catch μμμΌλ‘ μμΈ μΈμ€ν΄μ€κ° μ λ¬λλ©΄, κ°μλ¨Έμ μ μμΈκ° μ²λ¦¬λ κ²μΌλ‘ νλ¨ν΄ try ~ catchλ¬Έμ λ€μ λ¬Έμ₯μ μ΄μ΄μ μ€ννλ€.try {
1. ...
2. μμΈ λ°μ μ§μ
3. ...
}
catch(Exception e) {
...
}
4. μμΈ μ²λ¦¬ μ΄ν μ€ν μμ
2μ μμΉμμ μμΈκ° λ°μνμ κ²½μ°, catch μμμμ ν΄λΉ μμΈμ λν μ²λ¦¬κ° μ΄λ€μ§ λ€μ 3μ μμΉμμ μ€νμ μ΄μ΄κ°λ κ²μ΄ μλλΌ 4μ μμΉμμ μ€νμ΄ μ΄μ΄μ§λ€.try μμ μμμ μμΈκ° λ°μνλ©΄ μμΈμ²λ¦¬ μ΄νμ κ·Έ μμΈκ° λ°μν μ§μ μ΄νλΆν° λλ¨Έμ§λ₯Ό μ΄μ΄μ μ€ννλ κ²μ΄ μλ try ~ catchλ¬Έμ ν΅μ§Έλ‘ 건λλ°κ³ μ€ν νκ² λλ€.
λ°λΌμ tryλ μμΈκ° λ°μν μ μλ μμμ λ¬ΆκΈ° μν μ©λλ‘ μ¬μ©λλ€.
try μμμμ μμΈκ° λ°μνμ κ²½μ° μμ μλ catchλΆν° μλ μλ catchλ‘ λμ΄κ°λ€.import java.util.InputMismatchException;
import java.util.Scanner;
public class ExceptionCase4 {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
try {
System.out.print("a/b...aμ κ°μ μ
λ ₯νμΈμ: ");
int a = kb.nextInt(); // μ
λ ₯ μ€λ₯ λ°μ κ°λ₯
System.out.print("a/b...bμ κ°μ μ
λ ₯νμΈμ: ");
int b = kb.nextInt(); // μ
λ ₯ μ€λ₯ λ°μ κ°λ₯
System.out.printf("%d/%d = %d \n", a, b, a/b);
}
catch(ArithmeticException e) {
System.out.println(e.getMessage());
}
catch(InputMismatchException e) {
System.out.println(e.getMessage());
}
System.out.println("νλ‘κ·Έλ¨ μ’
λ£!");
}
}
// μ€ν κ²°κ³Ό
// (λΆλͺ¨κ° 0μΌλ‘ μ
λ ₯λ κ²½μ°)
a/b...aμ κ°μ μ
λ ₯νμΈμ: 5
a/b...bμ κ°μ μ
λ ₯νμΈμ: 0
/ by zero
νλ‘κ·Έλ¨ μ’
λ£!
// (μ«μκ° μλ λ¬Έμκ° μ
λ ₯λ κ²½μ°)
a/b...aμ κ°μ μ
λ ₯νμΈμ: e
null
νλ‘κ·Έλ¨ μ’
λ£!
catch ꡬ문 μμμ λ μ΄μμ μμΈλ₯Ό μ²λ¦¬νλ κ²λ κ°λ₯νλ€.import java.util.InputMismatchException;
import java.util.Scanner;
public class ExceptionCase5 {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
try {
System.out.print("a/b...aμ κ°μ μ
λ ₯νμΈμ: ");
int a = kb.nextInt(); // μ
λ ₯ μ€λ₯ λ°μ κ°λ₯
System.out.print("a/b...bμ κ°μ μ
λ ₯νμΈμ: ");
int b = kb.nextInt(); // μ
λ ₯ μ€λ₯ λ°μ κ°λ₯
System.out.printf("%d/%d = %d \n", a, b, a/b);
}
catch(ArithmeticException | InputMismatchException e) {
System.out.println(e.getMessage());
}
System.out.println("νλ‘κ·Έλ¨ μ’
λ£!");
}
}
// μ€ν κ²°κ³Ό
// (λΆλͺ¨κ° 0μΌλ‘ μ
λ ₯λ κ²½μ°)
a/b...aμ κ°μ μ
λ ₯νμΈμ: 5
a/b...bμ κ°μ μ
λ ₯νμΈμ: 0
/ by zero
νλ‘κ·Έλ¨ μ’
λ£!
// (μ«μκ° μλ λ¬Έμκ° μ
λ ₯λ κ²½μ°)
a/b...aμ κ°μ μ
λ ₯νμΈμ: e
null
νλ‘κ·Έλ¨ μ’
λ£!
Throwable ν΄λμ€java.lang.Throwable μ΄ λͺ¨λ μμΈ ν΄λμ€μ μ΅μμ ν΄λμ€μ΄λ€.public String getMessage()public void printStackTrace()π κ΄λ ¨ μμ (μμΈμ²λ¦¬ μ )
class ExceptionMessage {
public static void m1(int n) {
m2(n,0); // m2 λ©μλλ₯Ό νΈμΆ
}
public static void m2(int n1, int n2) {
int r = n1/n2; // μμΈ λ°μ μ§μ
}
public static void main(String[] args) {
m1(3);
System.out.println("νλ‘κ·Έλ¨ μ’
λ£!");
}
}
// μ€ν κ²°κ³Ό
Exception in thread "main" java.lang.ArithmeticException: / by zero
// (0μΌλ‘ λλμ
μ°μ°μ νμ¬ ArithmeticExceptionκ° λ°μνλ€.)
at ExceptionMessage.m2(ExceptionMessage.java:16)
// (ExceptionMessage ν΄λμ€μ m2μμ μμΈκ° μμλμκ³ )
at ExceptionMessage.m1(ExceptionMessage.java:12)
// (ExceptionMessage ν΄λμ€μ m1μΌλ‘ μμΈκ° λμ΄κ°μΌλ©°)
at ExceptionMessage.main(ExceptionMessage.java:20)
// (ExceptionMessage ν΄λμ€μ mainμΌλ‘ μμΈκ° λμ΄κ°λ€.)
λ©μλ νΈμΆ νλ¦ : main β‘ m1 β‘m2
m2μμ μμΈκ° λ°μνμ§λ§, m2μμ ν΄λΉ μμΈλ₯Ό μ²λ¦¬νμ§ μμ
β‘ κ°μλ¨Έμ μ m2λ₯Ό νΈμΆν m1μκ² μμΈμ²λ¦¬μ μ±
μμ λκΈ΄λ€.
m1μμλ μμΈλ₯Ό μ²λ¦¬νμ§ μμ
β‘ m1μ νΈμΆν mainμκ² μμΈμ²λ¦¬μ μ±
μμ λκΈ΄λ€.
mainμμλ μμΈλ₯Ό μ²λ¦¬νμ§ μμ
β‘ κ°μλ¨Έμ μ΄ λμ μμΈλ₯Ό μ²λ¦¬ν΄ μμΈ κ΄λ ¨ λ©μμ§μ μΆλ ₯κ³Ό νλ‘κ·Έλ¨μ μ’
λ£μν¨λ€.
π κ΄λ ¨ μμ (μμΈμ²λ¦¬ ν)
public class ExceptionMessage {
public static void m1(int n) {
m2(n,0); // μ΄ μ§μ μΌλ‘ m2λ‘λΆν° μμΈκ° λμ΄μ¨λ€.
}
public static void m2(int n1, int n2) {
int r = n1/n2; // μ΄ μ§μ μμ μμΈκ° λ°μνλ€.
}
public static void main(String[] args) {
try {
m1(3); // μ΄ μ§μ μμ m1μΌλ‘ λΆν° μμΈκ° λμ΄μ¨λ€.
}
catch(Throwable e) {
e.printStackTrace();
}
System.out.println("νλ‘κ·Έλ¨ μ’
λ£!");
}
}
// μ€ν κ²°κ³Ό
java.lang.ArithmeticException: / by zero
at ExceptionMessage.m2(ExceptionMessage.java:11)
at ExceptionMessage.m1(ExceptionMessage.java:7)
at ExceptionMessage.main(ExceptionMessage.java:16)
νλ‘κ·Έλ¨ μ’
λ£!
m2μμ λ°μν μμΈλ₯Ό main λ©μλμμ μ²λ¦¬ν¨
μ€μ λ‘ λμ΄μ€λ μμΈμ μΈμ€ν΄μ€ νμ
μ Throwableμ΄ μλμ§λ§, λͺ¨λ μμΈ ν΄λμ€λ Throwableλ₯Ό μμνκΈ° λλ¬Έμ catch μμμμ λ§€κ°λ³μλ₯Ό λ°μμ¬ μ μλ€.
( μ’μ μμΈμ²λ¦¬ λ°©μμ μλ! )
π ArrayIndexOutOfBoundsException
class ExceptionArrayIndexOutOfBounds {
public static void main(String[] args) {
int[] arr = { 1, 2, 3 };
for (int i = 0; i < 4; i++)
System.out.println(arr[i]); // μΈλ±μ€ κ° 3μ μμΈλ₯Ό λ°μμν΄
}
}
// μ€ν κ²°κ³Ό
1
2
3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at ExceptionArrayIndexOutOfBounds.main(ExceptionArrayIndexOutOfBounds.java:11)
π ClassCastException
class Board { }
class ABoard extends Board { }
class ClassCastException {
public static void main(String[] args) {
Board abd1 = new ABoard();
ABoard abd2 = (ABoard)abd1; // λͺ
μμ νλ³ν ok!
System.out.println(".. intermediate location ..");
Board bd1 = new Board();
ABoard bd2 = (ABoard)bd1; // μμΈ λ°μ
}
}
// μ€ν κ²°κ³Ό
.. intermediate location ..
Exception in thread "main" java.lang.ClassCastException: Board cannot be cast to ABoard (Board and ABoard are in unnamed module of loader 'app')
at ClassCastException.main(ClassCastException.java:13)
π NullPointerException
nullμ΄ μ μ₯λ μ°Έμ‘°λ³μλ₯Ό λμμΌλ‘ λ©μλλ₯Ό νΈμΆν λ λ°μνλ μ€λ₯μν©μ μλ―Ένλ μμΈ ν΄λμ€class NullPointerException {
public static void main(String[] args) {
String str = null;
System.out.println(str); // null μΆλ ₯
int len = str.length(); // μμΈ λ°μ
}
}
// μ€ν κ²°κ³Ό
null
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is null
at NullPointerException.main(NullPointerException.java:11)