[ 제 8장 예외처리 ]
<예외처리>
-예외처리
1. 직접처리(try-catch)
2. 보고(예외선언)(예외 떠넘기기)
3. 은폐 (빈 catch블럭)
4. (1,2) 예외 되던지기
-프로그램 오류의 종류
컴파일 에러 : 컴파일 시에 발생하는 에러(컴파일 中)
런타임 에러 : 실행 시에 발생하는 에러(비정상 종료)
논리적 에러 : 실행은 되지만
작성 의도와 다르게 동작 하는 것
(제일 심각한 에러, 문제 찾기 어렵고 수정이 어렵다)
심각도 : 컴파일 에러 < 런타임 에러< 논리적 에러
-런타임 에러
“에러는 어쩔 수 없지만, 예외는 처리하자”
1. 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류(복구불가)(포기)
2. 예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류(처리가능)(예외처리)
-예외 처리의 정의 와 목적
정의 : 프로그램 실행 시 발생할 수 있는 예외의
발생에 대비한 코드를 작성하는 것
목적 : 프로그램의 비정상 종료를 막고,
정상적인 실행상태를 유지하는 것
<예외 클래스의 계층구조(Exception을 나누면)>
Exception클래스들 : 사용자의 실수와 같은 외적요인
으로 발생하는 예외 – 필수처리
RuntimeException클래스들 : 프로그래머의 실수로
발생하는 예외 – 선택처리
<예외 처리하기 try-catch문>
예외가 발생할 가능성이 있는 문장을 try에 넣는다
예외가 발생했을 때 수행할 문장 catch에 입력(다수 가능)
try catch문은 if 문과 다르게 { }생략 불가
1. 예외가 발생하기 않은 경우 : catch 거치지 않고 전체 try-catch문 빠져나가서 수행 계속
2. 예외가 발생한 경우 :
발생한 예외와 일치하는 catch블록이 있는지 확인
일치 catch블럭 찾게 되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문 빠져나옴(나머지 무시)
(예외가 발생한 이후의 문장은 실행X)
일치하는 블록 없으면 예외처리 안됨 (프로그램 비정상종료)
Exception이 선언된 catch블록은 모든 예외처리가능(모든 예외의 최고조상)(제일 마지막 catch블록에 넣음)
<예외의 발생과 catch블럭>
printStackTrace() : 예외발생 당시의 호출스택에 있던 메서드의 정보와 예외 메시지를 화면에 출력
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다
멀티 catch블럭 : 내용이 같은 catch블록을 하나로 합친 것 (두 멤버의 공통 멤버만 사용 가능)
<예외 발생시키기>
1. 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception(“고의로 발생시킴”);
2. 키워드 throw를 이용해서 예외 발생시킨다
throw e;
checked예외 : 컴파일러가 예외처리여부 체크(예외처리 필수)(=Exception자손들)
unchecked예외 : 컴파일러가 예외 처리 여부를 미체크(예외처리 선택)(=RuntimeException자손들)
<메서드에 예외 선언하기>
-예외 처리 방법: try-catch문, 예외 선언하기
-메서드가 호출 시 발생가능한 예외를 호출하는 쪽에 알리는 것
<finally블럭>
예외 발생여부와 관계없이 수행되야 하는 코드 넣는다
finally블록은 try-catch문 맨 마지막에 위치해야 한다
< 사용자 정의 예외 만들기 >
우리가 직접 예외 클래스를 정의하는 것(상속을 통해)조상 Exception과 RuntimeException 중에 선택
Exception 사용자가 발생시키는 예외(필수처리)(try-catch사용)
RuntimeException 프로그래머의 실수로 발생시키는 예외(선택처리)
(가능하면 선택처리가능한 RuntimeException을 조상으로 하기)
매개변수 생성자 생성 필요
ex) MyException(String msg){
//문자열을 매개변수로 받는 생성자
super(msg); } //조상 클래스의 생성자 호출
< 예외 되던지기 >
예외를 처리한 후 다시 예외를 발생시키는 것
호출한 메서드와 호출된 메서드 양쪽 모두에서 예외 처리하는 것(분담처리)
< 연결된 예외 >
한 예외가 다른 예외를 발생시킬 수 있다(한 예외안에 다른 예외를 넣어 포함시킨다)
예외 A가 예외 B를 발생시키면, A는 B의 원인 예외
- 연결된 예외 사용이유
1. 여러 예외를 하나로 묶어서 다루기 위해서
2. checked예외(필수)->unchecked예외(선택)변경 위해
[ 제 9장 java.long패키지와 유용한 클래스 ]
< Object클래스 >
모든 클래스의 최고 조상. 오직 11개의 메서드만 가지고 있다
< boolean equals (Object obi) >
객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true 다르면 false
Object 클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)
인스턴스 변수( iv )의 값을 비교하도록 equals()를 오버라이딩해야 한다
< toString( ) >
객체를 문자열(String)로 변환하기 위한 메서드
< 얕은 복사와 깊은 복사 >
- 얕은 복사
값을 공유 , 그렇기에 수정하면 원본 바뀜
읽기를 할 때 주로 사용
복사 시간이 빠르다
- 깊은 복사
값을 개별로 가진다 수정해도 원본에 문제 X
쓰기를 할 때 주로 사용
복사 시간이 느림
< String 클래스 >
String클래스 = 데이터(char[])+메서드(문자열 관련)
내용을 변경할 수 없는 불변(immutable)클래스
불변의 특징 ex) String a= “a” ;
String b =”b” ;
a = a + b ;
문자열 결합에서 a에 ab가 저장되는 게 아닌 새로운 ab문자열이 만들어져 거기에 저장됨, 주소만 바뀜
불변의 특징
- 문자열 비교
String str =”abc“;과 String str = new String(“abc”);차이
ex) String str1 =”abc“;
String str2 =”abc“
//문자열 리터럴 “abc”의 주소가str1,2저장됨(하나 공유)
String str3 = new String(“abc”);
String str4 = new String(“abc”);
//새로운 String인스턴스 생성(항상새로운 문자열 생성)
문자열은 내용 변경 불가라 여러 참조변수 내용 공유해도 상관 X String str = new String(“abc”); 보다는 String str =”abc“; 사용이 적합
==는 주소비교 , equals 는 내용비교
< 빈 문자열( “ “, empty string) >
내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열
크기가 0인 배열을 생성하는 것은 어느 타입이나 가능
문자(char)와 문자열(String)의 초기화
'공부 > JAVA' 카테고리의 다른 글
[1회차 01] 자바 간단 정리 (0) | 2024.05.09 |
---|---|
[java] 정석코딩 자바 문제 오답노트 (0) | 2024.04.04 |
[java] 자바의 정석 요약정리 6 ~ 7장 (0) | 2024.04.04 |
[java] 자바의 정석 요약정리 2 ~ 5장 (0) | 2024.04.04 |