예외 처리
try-catch-finally 블록을 사용하여 구현try-catch 블록 외에도 throws 키워드를 사용하여 예외를 호출한 메서드로 전달하거나, 직접 예외를 생성하여 던질 수도 있음예외가 발생할 수 있는 코드는 try 블록 안에 작성
try 블록의 코드를 실행하다가 예외가 발생
→해당 예외에 대한 처리를 담당하는 catch 블록이 실행
catch 블록
catch 블록은 예외의 타입에 따라 여러 개를 사용할 수 있음
발생한 예외의 타입과 일치하는 catch 블록이 실행됨
finally 블록
finally 블록은 예외 발생 여부와 상관없이 항상 실행되는 코드
try {
// 예외가 발생할 수 있는 코드
//ex) 파일 오픈...등등
//if 파일 못찾으면 -> throws FileNotFoundException
} catch (ExceptionType1 e1) {
// ExceptionType1 예외를 처리하는 코드
//에러 메시지 출력하거나, 뭐 해
System.out.prinln(e1.getMessage());
} catch (ExceptionType2 e2) {
// ExceptionType2 예외를 처리하는 코드
} finally {
// 예외 발생 여부와 상관없이 항상 실행되는 코드
//막 파일 닫기 요런 거 해
}
사용자 정의 정의 예외 클래스는 **Exception** 을 상속 받아서 만듬
public class SomeException extends Exception {
//생성자를 호출하여 예외 메시지를 설정
public SomeException(String message) {
super(message);
}
//필요에 따라 추가적인 매개변수를 받아
//예외 객체를 초기화도 가능 (생성자로)
//필요한 메서드를 추가하여
//예외 객체를 조작하거나 정보를 제공 가능
public void someCustomMethod() {
// 예외 객체에 대한 추가적이인 동작을 정의합니다.
}
}
이렇게 만든 예외 클래스를 다른 곳에서 throws 하여 예외를 던지면 됨
throws 키워드를 사용하여 예외 처리하기
public void someMethod() throws SomeException {
// 예외가 발생할 수 있는 코드
//예외가 발생하면 SomeException throw함
throw new SomeException("error"); //SomeException도 객체이기 때문에
//new 키워드 사용
}
public void callerMethod() {
try {
someMethod(); // someMethod() 호출
} catch (SomeException e) { //SomeException throw되면
// SomeException 예외를 처리하는 코드
System.out.println(e.getMessage()); //"error" 콘솔창에 출력
System.exit(0);
}
}
throw:throw는 예외를 발생시키는 역할을 합니다.throw 키워드 뒤에는 예외 객체를 명시하며, 해당 예외 객체는 예외 클래스의 인스턴스.throw 문은 메소드 내에서 사용되며, 예외가 발생한 지점에서 직접 처리되지 않고 호출자로 예외를 전달.javaCopy code
public void doSomething() throws CustomException {
if (/* 예외 조건 */) {
throw new CustomException("예외 발생");
}
}
throws:throws는 메소드 선언부에 사용되며, 해당 메소드가 예외를 던질 수 있다는 것을 나타냄.throws 키워드 뒤에는 해당 메소드에서 던질 예외 클래스들을 명시합니다. 여러 예외 클래스를 선언할 경우 쉼표로 구분.throws를 사용하여 예외를 선언하면, 해당 메소드를 호출하는 쪽에서 예외를 처리하도록 요구.throws는 메소드 선언부에만 사용되며, 메소드 내에서 실제로 예외를 발생시키지 않음.javaCopy code
public void doSomething() throws CustomException {
// 메소드 구현 내용
}
시간, 분 단위 넘어가면 예외 처리 하는 예시 코드
package ExceptionHandling;
//InvalidTimeException class (static) 만들기
//시간, 분 단위 넘어가면 예외
//CheckTime은 hh:mm xx 리턴함(xx는 pm, am)
public class pratice {
public static void main(String [] args) {
String s1= "14:23 am";
String s2= "11:16 PM";
String s3= "08:60 AM";
System.out.println(s1+"\n"+s2+"\n"+s3);
try {
pratice.checkTime(s1);
}catch(InvalidTimeException e) {
System.out.println(e.getMessage());
}
try {
pratice.checkTime(s2);
}catch(InvalidTimeException e) {
System.out.println(e.getMessage());
}
try {
pratice.checkTime(s3);
}catch(InvalidTimeException e) {
System.out.println(e.getMessage());
}
}
//hh:mm xx폼으로 입력 받음
public static void checkTime(String t) throws InvalidTimeException {
//정규 표현식에서는 |를 사용하여 "OR" 연산을 수행하며, 논리 연산자 ||는 조건문에서 사용
String rgx="^(1[0-2]|0?[0-9]):([0-5][0-9]) [APap][Mm]$";
//^은 문자열 시작, $은 문자열 끝
//a?b는 "a가 0 또는 1번 나타날 수 있고, 그 뒤에 b가 나와야 한다
if(!t.matches(rgx))
throw new InvalidTimeException("Time fomat exception "+t);
}
}
class InvalidTimeException extends Exception{
public InvalidTimeException() {
super("there value is don't exist"); //에러 잡힘?
}
public InvalidTimeException(String message) {
super(message);
}
}
Exception 클래스: 모든 예외 클래스의 상위 클래스인 Exception은 프로그램 실행 중 발생할 수 있는 예외 상황을 처리하기 위해 사용. 예외 처리를 강제하지 않는 비검사 예외(Unchecked Exception)와 예외 처리를 강제하는 검사 예외(Checked Exception)로 구분.
RuntimeException 클래스: RuntimeException 클래스는 예외 처리를 강제하지 않는 비검사 예외(Unchecked Exception)의 상위 클래스. 주로 프로그래머의 실수나 잘못된 사용으로 발생하는 예외 상황을 처리하기 위해 사용. 대표적인 예로 NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException 등이 있음.
IOException 클래스: IOException 클래스는 입출력 작업에서 발생하는 예외 상황을 처리하기 위해 사용. 파일 처리, 네트워크 통신 등 입출력과 관련된 동작에서 발생하는 예외를 처리할 때 사용. 예를 들어 FileNotFoundException, SocketException, EOFException 등이 있음.
SQLException 클래스: SQLException 클래스는 데이터베이스와 관련된 예외 상황을 처리하기 위해 사용. 데이터베이스 연결, 쿼리 실행, 트랜잭션 등의 작업에서 발생하는 예외를 처리할 때 사용.
NullPointerException 클래스: NullPointerException 클래스는 객체 참조가 null인 상태에서 해당 객체의 멤버나 메서드에 접근하려고 할 때 발생하는 예외를 처리하기 위해 사용.