on
Java Exeption(예외)
Java Exeption(예외)
예외처리 오류 종류
# Error(오류), Exception(예외)
Error = 하드웨어의 잘못된 동작, 고장으로 인한 오류 에러가 발생되면 프로그램 종료 정상 실행 상태로 사용불가
Exception = 사용자의 잘못된 조작, 개발자의 잘못된 코딩으로 인한 오류 예외가 발생되면 프로그램 종료되나 예외 처리를 추가하면 정상 실행할 수 있음.
Exception종류
#일반 예외, 실행 예외
일반 예외 = 예외 처리 코드가 없으면 컴파일 오류 발생
실행 예외 = 예외 처리 코드를 생략하더라도 컴파일이 되는 예외, 경험 따라 예외 처리 코드 작성 필요
#Throwable는 예외 처리할 수 있는 클래스중 최상위 클래스이다. 다음으론 Exception
# toString()은 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드
실행 예외
NullPointerException = 객체 참조가 없는 상태.
ArrayindexOutOfBoundsException = 배열이 인덱스 범위를 초과하여 사용할 경우 발생
ClassCastException 타입 변환이 되지 않을 경우 발생
NumberFormatException 숫자형 포맷 오류, 문자를 숫자로 변경하려다 발생하는 오류.
public class NullPointerExceptionExample {
public static void main(String[] args) {
String date = null; // String타입의 date의 값은 unll이다.
System.out.println(data.toString()); // Date의 값을 출력한다
// (NullPointerExceptionExample.java:6) 해당 오류가 표시된다.
}
} public class ArrayIndexOutOfBoundsExceptionExample {
public static void main(String[] args) {
if(args.length == 2) { // args의값이 2개일때.
String data1 = args[0]; // String타입의 data1과 2를 만들고
String data2 = args[1]; // 각각 args의 0번째와 1번째의 값을 각각 저장한다
System.out.println("args[0]" + data1);
System.out.println("args[0]" + data2); // 출력한다.
} else { // 그렇지 않으면 (위에가 다를경우)
System.out.println("실행 방법");
System.out.println("java ArrayIndexOutOfBoundsExceptionExample");
System.out.println("값1, 값2");
}
}
} public class ClassCastExceptionExample {
public static void main(String[] args) {
Dog dog = new Dog(); // Dog와 Cat 사용하기위해 선언한다.
changeDog(dog);
Cat cat = new Cat();
changeDog(cat);
}
public static void changeDog(Animal animal) {
Dog dog = (Dog) animal;
}
}
class Animal { // 사용할 클래스를 추가로 만들고
}
class Dog extends Animal{ // Animal의 클래스를 상속받을 Dog 와 Cat의 클래스를 만들어준다.
}
class Cat extends Animal{
} public static void main(String[] args) {
String data1 = "100"; // string 타입의 data1과 2의 값을 주고
String data2 = "a100";
int value1 = Integer.parseInt(data1);
// 숫자형의 문자열을 받아서 intger형으로 반환(변환)시키고.
int value2 = Integer.parseInt(data2);
int result = value1 + value2; // int타입의 result를 추가해 반환된 value1과 2의 값을 result에 저장한다
System.out.println(data1 + "+" + data2 + "=" + result); // 값을 출력한다.
// 실행시 (NumberFormatExceptionExample.java:11) 해당 오류가 뜬다.
}
}
nullpointer 오류는 객체 참조가 없어 오류가 발생한다.
array 오류는 받을 args의 값이 없기 때문에 발생한다.
classcast 오류는 Cat라는 타입이 변환되지 못하니 발생한다.
number 오류는 data2의 값이 a100이기에 문자열을 숫자로 사용할 수 없기에 발생한다.
예외처리 코드(try-catch-finally)
예외 발생 시 프로그램 종료를 막고, 정상 실행 유지할 수 있도록 처리한다.
일반 예외 : 반드시 작성해야 컴파일이 가능
실행 예외: 컴파일러가 체크해주지 않고, 개발자 경험에 의해 작성
try-catch-finally 블록을 이용해 예외처리 코드 작성
try {
// 예외 발생하는 코드
} catch(발생하는 예외 e) {
// 해당 예외가 발생하면 어떻게 처리할지
} finally {
// 예외 여부와 관계없이 실행시킬 코드
}
#Integer.parseInt() 주어진 문자열을 정수로 변환시킨다
#Double.parseDouble() 주어진 문자열을 실수로 변환시킨다
다중 catch
예외 별로 예외 처리 코드 다르게 구현한다.
try블록에서 다발적으로 예외가 발생하지는 않고, catch가 여러 개 있다 하더라도 하나의 예외가 발생하면 발생하는 catch 블록으로 이동한다. catch의 발생하는 예외는 하위 예외 클래스가 항상 상위 예외 클래스보다 위에 있어야 한다.
#예를 들어 NullPointerException 객체 참조가 없는 오류가 발생하고 , ClassCastException 타입으로 변환되지 않는 상태라 할 때 둘 중 하나의 오류는 Exception 오류처리 코드로 작성한다.
try {
// 예외 발생하는 코드
} catch(NullPointerException e) {
// 해당 예외가 발생하면 어떻게 처리할지
} catch(Exception e){
// 나오는 모든 예외가 발생하면 어떻게 처리할지
}finally {
// 예외 여부와 관계없이 실행시킬 코드
}
멀티(multi) catch는 catch 블록 하나로 여러 개의 예외처리도 가능하단 내용이다.
#예를 들어 NullPointerException 객체 참조가 없는 오류가 발생하고 , ClassCastException 타입으로 변환되지 않는 상태라면 shift + \ = | 로 연결시킨다.
try {
// 예외 발생하는 코드
} catch(NullPointerException | ClassCastException e) {
// 해당 예외가 발생하면 어떻게 처리할지
} finally {
// 예외 여부와 관계없이 실행시킬 코드
}
자동 리소스 닫기
try-with-resources
# 예외 발생 여부와 상관없고, 사용했던 리소드 객체의 close() 메소드를 호출해 리소스를 닫는다
리소스 객체는 각족 입출력 스트림(인풋, 아웃풋), 서버 소켓, 소켓, 각종 채널
Java.lang.AutoCloseable;인터페이스를 구현하고 있어야 함.
#예외를 발생시킬 때 throw라는 코드가 들어가고 예외를 떠넘길 때 throws라는 코드가 들어간다.
from http://workerst.tistory.com/35 by ccl(A) rewrite - 2021-10-19 15:01:33