예외처리
1.오류와 에외
오류(Error): 시스템의 오류, JVM 오류 ...: 통제 불가 오류
예외(Exception): 코드 상의 오류 : 통제 가능한 오류
Throwable
-예외있든 없든 처리가 안되어 있으면 컴파일 X
-예외의 체크는 컴파일시 체크, 예외가 있으면 컴파일 X
-예외가 발생하든 안하든 반드시 적절한 예외처리가 필요한 예외
-엄격한 예외, 형식을 매우 중시
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Ex02 {
public static void main(String[] args) {
// throw new FileNotFoundException(...)
try {
FileInputStream fis = new FileInputStream("da.txt");
//에러 발생시 하단 코드 실행 X
System.out.println("파일 처리..");
} catch (FileNotFoundException e) { // e = new FileNotFound ...
System.out.println("예외 발생");
// String message = e.getMessage();
// System.out.println(message);
e.printStackTrace();
}
System.out.println("매우 중요한 실행 코드");
}
}
RuntimeException을 중간에 상속받은 예외 클래스
-예외가 발생하더라도 컴파일 O, class 파일 생성
-예외의 체크는 실행 중 체크, 실행이 되려면? calss 파일필요 (컴파일은 됨)
-유연한 예외, 형식은 X
public class Ex01 {
public static void main(String[] args) {
try {
int num1 = 10;
int num2 = 0;
int result = num1 / num2;
System.out.println(result);
} catch (ArithmeticException e) {
e.printStackTrace();
}
System.out.println("매우 중요한 코드...");
}
}
1.try ~ catch 문
try {
// 예외가 발생할 가능성이 있는 코드
} catch (예외 객체 ....) {
// 예외 발생시 처리할 코드
}
참고)
예외 발생
throw 예외객체;
예외, 오류 -> 원인을 확인을 하는것이 중요
예외 클래스 주요 메서드 : 정보확인
java.lang.Throwable
-String get Message() - 오류메세지 확인
-void printStackTrace()
catch (Exception e) {
System.out.println("유입!");
e.printStackTrace();
}
또 두개 이상의 예외 처리를 한 개의 catch문으로 처리할 때
catch (ArithmeticException | NullPointerException e) {
e.printStackTrace();
}
위와 같이 처리할 수 있다.
2.try-catch-finally문
- 자원을 소비하는 객체 - FileInputStream, FileOutputStream, Connection, PrepareStatement ...
- 자원 해제 -> 애플리케이션 종료시에 해제
- 서버? 종료 X -> 자원해제를 하지 않으면 메모리 부족 현상 발생
- 자원해제를 적절하게 해야 된다.(close()...)
try {
} catch (...) {
...
} finally {
// 예외가 발생하든 안하든 항상 실행되는 코드
// return 하더라도 코드가 실행
}
public class Ex04 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("a.txt" );
System.out.println("파일 작업...");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) { //자원 해제
try {
fis.close();
} catch (IOException e) {
}
}
}
}
}
다소 복잡하다.
그걸 보완하기 위해 나온 구문
3.try-with-resources문
- JDK7에서 추가
- 자원 해제를 자동
try ( 해제할 자원 객체;
해제할 자원 객체 ...) {
// 예외가 발생할 가능성이 있는 코드
} catch(예외 객체 ...) {
}
자원 자동해제의 기준
AutoCloseable 인터페이스의 구현 클래스
public class Ex05 {
public static void main(String[] args) {
try(FileInputStream fis = new FileInputStream("a.txt")) {
// AutoCloseable auto = fis;
} catch (IOException e) {
e.printStackTrace();
}
}
}
다형성으로 AutoCloseable 이용해서 자동 해제. (생략)
-JDK 기본 정의 예외 외에 따로 작성하는 예외
예) String
java.lang.String
컴파일러가 패키지명 바로 아래쪽 import java.lang.*;가 추가
Object 클래스
- 모든 클래스의 상위 클래스
- 상속이 명시 X -> extends java.lang.Object 가 추가(컴파일러)
toString() 메서드
equals() 메서드
hashCode() 메서드
String 클래스
Wrapper 클래스
Wrapper 클래스의 종류
Integer 클래스 사용하기
1) Integer 클래스의 메서드
오토박싱과 언박싱
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
-getClass().getName(): 클래스명(패키지명을 포함한 전체 클래스명)
-Integer.toHexString(hashCode()) : 객체의 주소값을 16진수로 변환한 문자열
위 형식을 따르지 않았을경우 모두 재정의 된것 .
generate -> override method -> toString
-개체를 찾기 위한 값
-기본값은 유일한 값으로 쓰기 위한 객체의 주소 값
-> 동등성 비교를 위한 재정의 가능
hash: 같은 값에 대해서 같은 값을 생성
public boolean equlas(Object obj) {
return(this == obj);
}
동일성 비교(주소) : ==
동등성 비교 : equals를 재정의(내부 가치를 비교함)
재정의를 사용하게끔 의도해서 설계되어있고
기본적으로는 str과 int만 재정의가 되어있다.
(주소 비교가 아닌 object를 새로 만들어 동등성을 비교하게끔)
나머지 자료형에 관해서는 주소값 비교.
참고)
String
문자열 비교 == 사용 X
equals 사용 O
해시코드도 동등성비교의 기준
public static void main(String[] args) {
Book book1 = new Book(1000, "책1", "저자1");
Book book2 = new Book(1001, "책2", "저자2");
System.out.println(book1.equals(book2));
}
참고) 중복제거
@Override
public int hashCode() {
return Objects.hash(isbn, title, author);
}
를 제너레이터로 생성하면 동일한 해쉬태그와 같은 equals 동등성을 가지고 있다면 제거 된다.
java.util.Objects 문서확인
매개변수를 가변적으로 받음
public class Ex08 {
public static void main(String[] args) {
sum(10, 20, 30, 40);
}
public static int sum(int...nums) {
System.out.println(Arrays.toString(nums));
return 0;
}
}