* 예외(exception) 처리
프로그래머는 예외 상황을 미리 예측하고 처리할 수 있다.
- 예외처리하는 문법( try-catch-finally )
try{ // 수행할 코드, 예외 발생 가능성이 있는 블록
...
} catch(예외클래스 변수명) { // 예외 처리 블록
...
} finally { // 예외 발생 여부에 상관없이 반드시 실행되는 블록.
}
오류가 발생할 예상 부분을 try라는 블록으로 감싼 후 발생할 오류와 관련된 Exception을 catch라는 블록에서 처리한다.
오류가 발생했든 안했든 무조건 실행되는 finally라는 블록을 가질 수 있다. finally블록은 생략가능하다.
try내에서 오류가 발생하면 오류가 발생한 시점부터 try블록의 마지막줄까지는 실행이 되지 않는다. 바로 catch블록으로 넘어가서 예외를 처리하게 되는데 이 때 발생한 예외와 catch블록에 내가 선언해 놓은 예외가 맞아야 해당 catch블록을 실행시킨다. 예외가 발생하지 않았다거나, 예외가 발생했더라도 try에서 발생한 예외와 내가 선언한 catch가 다르다면 try나 catch가 반드시 실행될 것이다라고 예측할 수는 없다. 하지만 finally블록은 예외가 발생했든 발생하지 않았든 무조건 실행이 된다.
try블록에서 여러가지 예외가 발생한다면 catch 블록을 여러 개 사용할 수 있다.
Exception클래스들은 모두 Exception클래스를 상속받으므로 예외클래스에 Exception을 두게 되면 어떤 오류가 발생하든지 간에 하나의 catch블록에서 모든 오류를 처리할 수 있다.
* Throws
throws는 예외가 발생했을때 예외를 호출한 쪽에서 처리하도록 던져준다.
public class ExceptionExam2 {
public static void main(String[] args) {
int i = 10;
int j = 0;
try {
int k = divide(i,j);
System.out.println(k);
} catch(Exception e) {
System.out.println(e.toString());
}
}
public static int divide(int i, int j) throws Exception{ // 발생할 예외
// divide 메소드는 Exception이 발생하니 divide메소드를 호출하는 쪽에서 오류를 처리하세요.
int k = i/j;
return k;
}
}
* Exception 발생시키기(throw)
강제로 오류를 발생시키는 throw
throw는 오류를 떠넘기는 throws와 보통 같이 사용됨.
public class ExceptionExam3 {
public static void main(String[] args) {
int i = 10;
int j = 0;
try {
int k = divide(i,j);
System.out.println(k);
}catch(IllegalArgumentException e) {
System.out.println(e.toString());
}
}
// 해당 오류는 divide를 호출한 쪽에서 처리해야 한다.
public static int divide(int i, int j) throws IllegalArgumentException {
if(j==0) {
throw new IllegalArgumentException("0으로 나눌 수 없습니다.");
}
// j가 0일 경우에 new연산자를 통하여 IllegalArgumentException 객체가 만들어진다.
// new 앞에 throw는 해당 라인에서 익셉션이 발생한다는 의미이다.
// IllegalArgumentException : argument가 잘못되어서 발생한 오류.
int k = i/j;
return k;
}
}
* 사용자 정의 Exception
Exception이나 Exception의 후손(runtime exception)을 상속받아 만들어진 클래스.
public class 클래스이름 extends Exception {
...
}
이렇게 해주는 이유는 Exception이라는거 자체가 특별한 일을 하지는 않지만, 클래스의 이름만으로 어떤 오류가 발생했는지 알려주어 코드의 직관성을 높인다.
- Exception 클래스를 상속 받은 클래스는 checked Exception라고 한다.
반드시 오류를 처리 해야만 하는 Exception, 예외 처리하지 않으면 컴파일 오류를 발생 시킨다.
- RuntimeException 클래스를 상속 받은 클래스는 unChecked Exception
예외 처리하지 않아도 컴파일 시에는 오류를 발생시키지 않는다. but, 모든 예외 상황을 적절하게 처리해주는 것이 프로그램이 더 안정적으로 수행될 수 있다.
프로그래머스 코딩테스트 입문 문제풀기!
1. 약수의 합
for문, if문 이용
2. 짝수는 싫어요
n 이하의 짝수가 오름차순으로 담긴 배열 return
for문 이용
3. 피자 나눠 먹기 (1)
피자를 일곱 조각으로 잘라 준다. 피자를 나눠먹을 사람의 수 n이 주어질 때, 모든 사람이 피자를 한 조각 이상 먹기 위해 필요한 피자의 수 return
4. 피자 나눠 먹기 (2)
피자를 여섯 조각으로 잘라 준다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return
5. 피자 나눠 먹기 (3)
피자를 두 조각에서 열 조각까지 원하는 조각 수로 잘라준다. 피자 조각 수 slice와 피자를 먹는 사람의 수 n이 매개변수로 주어질 때, n명의 사람이 최소 한 조각 이상 피자를 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 return
'STUDY > JAVA' 카테고리의 다른 글
[TIL] 프로그래머스 - 숫자 짝꿍 (0) | 2023.05.22 |
---|---|
[TIL] 약수의 개수 구하기 빠른 방법 (0) | 2023.05.14 |
230410 공부기록 (0) | 2023.04.11 |
230409 공부기록 (0) | 2023.04.11 |
230406 공부기록 (0) | 2023.04.11 |