-
12. 예외처리(Exception)program_language 및 궁금한것/Java 2019. 4. 23. 18:17
예외처리: Exception <-- 당신 그럴줄 몰랐어!
- 프로그램 실행 중에 발생하는 예기치 않은 사건!
( 자바는 프로그램 실행 중 발생할 수 있는 예외를 처리할 수 있는 기법을 제공한다.)
( 또, 발생하는 모든 예외를 객체로 취급하고 예외관련 클래스를 제공한다.)
- 예외에 대응하는 추가코드 작성이 예외처리이다 !
ex)
정수를 0으로 나누는 경우 (프로그램에서 기본적으로 0으로 나누는 기능이 없다.]
배열의 첨자가 음수값을 가지는 경우
배열 첨자가 배열의 크기를 벗어나는 경우
부적절한 형변환이 일어나는 경우
ex)
캐스팅!
double d=30; <-- 묵시적인 형변환! 왜? double>int, d에는 30.0이 저장된다.
doble d=(double)30; <-- 명시적 형변환
클래스 간의 상속관계가 없을 시에 에러가 발생한다.
( 부모캐스팅은 보통 생략한다.)
Object ob="나길동"; ob.length() ? (x) //<--부모참조변수ob로 자식클래스의 메소드 호출 불가 ob.toString() ?(x) //<-- toString()메소드는 String의 메소드 (String)Object //<--자식 캐스팅: 반드시 명시해야 한다. String str=(String)ob; str.length() //<---3 (o)
입출력시 인터럽트가 발생하는 경우
내부에서 작업 스케쥴러를 진행하는데 기본적으로 입출력 장치에게 먼저 우선권을 준다. 그래서 자바입출력을 하다가 인터럽트가 발생할 수 있다.
입출력하기 위해 지정한 파일이 존재하지 않거나 파일 이름이 틀린경우.
[기본 예외 상황 처리기]
프로그램 --- 실행 --- 예외발생 --- JVM에게 예외발생 알림
JVM: 예외발생시 관련된 예외클래스로부터 예외 객체생성, 프로그램에서 지정된 예외처리루틴에게 Exeption개체를 넘겨준다. (** 예외는 메소드 호출할때 발생하게 된다.)
Exception클래스 계층 구조
java.lang.Throwable
Error 혹은 Exception
Error: 하드디스크가 망가진 경우, 메모리파괴, 스택오버플로우(메모리를 넘많이 사용함)<-- JVM에게 맡기는게 일반적
그렇다면 Exception은 어떻게 처리할까?
예외처리 구문형식이 있다.
- 이전의 throws 문은 예외가 발생시 할일에 대해 책임전가의 뜻을 가짐
책임전가란 ?
gildong()메소드에서 throws IOException을 하고, lime에서 gildong()을 호출하면 그 상황에 대한 처리는 lime()메소드가 한다.
try도 if와 같이 간주한다. try자체가 예외가 발생할 가능성이 있는 문장을 감싸기 때문이다.
try: 이곳에서 에러 발생이 나면 catch finally가 실행이 안된다.
catch: JVM에서 에러 발생내역을 확인하고 던져주는 메세지를 받는 곳이다.
catch안에 return을 하면 finally만 실행하고 클래스를 빠져나온다. 즉, finally {} 아래의 문장은 실행되지 않는다.
finally: 예외 발생과 상관없이 반드시 일어나야 할 문장.
<--FileSystem은 꼭 fs.close를 해줘야 하는데. 예외가 발생하던 아니던 fs.close를 할 수 있다.
FileSystem --> DataBase ( 이것들을 사용하면 정보는 비 휘발성)
e.printStackTrace();
문제가 발생한 코드와 연관된 메소드들의 호출 관계를 표현
e.toString()
java.lang.ArithmeticException <-- 어떤 Exception인지 나온다.
case1) 각각 처리
try { AException이 발생할 가능성 있는 문장 } catch (AException e) { AException을 처리할 문장 } try { BException이 발생할 가능성 있는 문장 } catch (BException e) { BException을 처리할 문장 } try { CException이 발생할 가능성 있는 문장 } catch (CException e) { CException을 처리할 문장 }
case2) 다중 catch를 사용: 일반적으로 많이 사용한다.
try { AException이 발생할 가능성 있는 문장 BException이 발생할 가능성 있는 문장 CException이 발생할 가능성 있는 문장 } catch (AException e) { AException을 처리할 문장 } catch (BException e) { BException을 처리할 문장 } catch (BException e) { BException을 처리할 문장 }
*** 다중 catch 사용시 주의할 점!
- 부모 자식 클래스 정의하는 순서에 주의!
- 자식 클래스에 대한 catch문을 먼저 정의를 해야한다.
catch(부모)
catch(자식) <--- xxxxxxx
왜? 이미 부모에 자식이 포함되어 있기 때문에 자식 Exception이 났을때 부모만 실행되고 자식은 절대 실행되지 않는다.
ex) Exception과 IOException과 같은 예로 보면 될것같다. Exception하나로는 공통된 에러 처리만 가능하고, 상세 에러는 각 Exception별로 처리한다.
예외 종류
1. 체크 예외(Checked) <-- unhandled exception
ex) System.in.read();<-- IOException
new FileReader("a.txt") <-- FileNotFoundException
컴파일 에러발생 - .class생성이 안된다.
명시적으로 발생할 수 있는 예외에 대한 처리를 강요
반드시 try~catch 또는 throws를 사용해야 한다.
자바식 결과물이 없다.
기본값이 있으면 에러가 안난다.
변수는 초기값을 지정해주면 컴파일 에러가 나지 않는다.
2. 언체크 예외
개발자실수 또는 사용자 입력데이터 예외
컴파일시 에러가 발생하지 않는다.
특징은 RuntimeException(부모)을 상속받는 예외(자식) 블래스이다.
unhandle에러가 나지 않는것은 RuntimeException을 상속받는 예외
if문으로 Exception 처리가 가능하다.
ex) IndexOutOfBindException의 경우 컴파일 시에는 에러가 발생하지 않고 런타임시 에러 발생!
3. 사용자 정의 예외
- 예외의 발생은 JVM에 의해 실행중 발생할 수 있지만 사용자 프로그램에서 인위적으로 예외를 발생시킬 수 있다.
(throw문을 제공)
-
<자바상속>
- 부모클래스가 갖는 속성과 기능을 자식클래스에게 물려주는 것.
( 단, 부모의 private맴버와 부모의 생성자는 상속에서 제외)
<오버라이딩(메소드 재정의) 규칙>
자식쪽 메소드를 오버라이딩이라고 한다.
class Parent{
접근제한자 void hello() throws A, B, C{
}
}
** 오버라이딩 시 주의 할 점
1. 접근제한자는 부모와 동일하거나 또는 확장해야 합니다.
2. throws는 부모와 동일하거나 또는 축소해야 합니다.
class Child extands Parent{
// 부모의 hello안에 있는 내용을 바꾸는게 오버라이딩
접근제한자 void hello() throws A, B, C{
}
}
만약,
부모 public hello(){ }라면 자식은 public hell() { }
부모 protected hello(){ } 자식은 public/protected hello(){ }
부모 hello(){ } 자식 생략/protected/public hello(){ }
부모 private hello() { }라면 자식은 접근할 수 없다!!!!!
Exception의 경우는??
부모 public hello() throws AException, BException, CException{ }
--> 자식은 생략만 가능하다. 추가할 수 없다.
--> 자식 public hello() throws AException, BException, CException{ }
자식 public hello() throws AException, BException{ }
--> 에러나는 오버라이딩throws
자식 public hello() throws AException, BException, CException, DException{ } 확장x
자식 public hello() throws Exception { } 상위
반응형'program_language 및 궁금한것 > Java' 카테고리의 다른 글
13. 내부클래스, 외부클래스, static (0) 2019.04.24 이클립스 경로 Path 확인하기 (0) 2019.04.23 11. 배열, 벡터 (0) 2019.04.22 10. 루프(반복문)을 빠져 나오는 방법! (0) 2019.04.22 9. 문자열의 인덱싱, 대소문자 무시비교 (0) 2019.04.22