자바수업 기록

자바18강 예외처리

JadeStone 2022. 10. 17. 17:28

깃허브 : https://github.com/BigJadeStone/java-class 

 

 

GitHub - BigJadeStone/java-class: 자바수업 내용물 저장

자바수업 내용물 저장. Contribute to BigJadeStone/java-class development by creating an account on GitHub.

github.com

 

<오늘 수업 내용>
#interface
-interface간에도 상속이 가능하다.
-interface간에 상속은 extends를 이용한다.
-주의점. 한 인터페이스가 2개이상의 인터페이스를 상속받고 그렇게 
 상속받은 인터페이스를 상속받은 클래스는 상속받은 인터페이스 내에 있는 모든 메서드를 다 오버라이딩
 해주어야 한다.
참고 폴더: day09.inter.herit
이 내용은 우리가 직접 만들일은 없으니 이해만 하고 넘어가면 된다.
-추상클래스와 인터페이스는 비슷하지만 엄밀히말하면 다름.
 인터페이스는 클래스가 가지는 한계점을 보완하면서 발전된 형태라고 생각해도 무방합니다.

interface간 상속 사용 예시



자바교안 18강 예외처리

예외란?
예외에는 컴파일러 체크 예외와 실행 예외(Runtime Exception)가 있습니다.
(여기서 실행 예외가 중요. 컴파일러 체크 예외는 당연한것이고.)
- 컴파일러 체크 예외는 자바 소스를 컴파일하는 과정에서 예외 처리 코드를 검사하여 예외 처리
코드가 없다면 컴파일 오류가 발생합니다.
- 실행 예외는 컴파일하는 과정에서 예외처리 코드를 검사하지 않는 예외를 말합니다.


예외처리
(완벽한 프로그램이란 있을 수 없다. 그래서 오류가 발생했을 때 어떻게 처리하라고 해주는 일이 필요)
- 에러에 대한 처리를 의미한다.
- 자바는 예외처리 메커니즘을 제공한다.
- 프로그램에서 문제가 될만한 부분을 예상하여 사전에 "문제가 발생하면 이렇게 처리하라" 라고
 프로그래밍 하는 것을 예외 처리라고 합니다

대표적인 실행 예외의 종류
주요 실행 예외
참고폴더 : day10.exception.trycatch
- 1. NullPointerException (NPE) -> 피할 수 없는 에러. 
- 객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수로 객체 접근 연산자인 dot(.)를 사용했을 때 발생
합니다.
- 2. ArrayIndexOutOfBoundsException
- 배열에서 인덱스 범위를 초과하여 사용할 경우 발생합니다.
- 3. NumberFormatException
- 문자열로 되어 있는 데이터를 숫자로 변경하는 경우에 발생합니다.
- 4. ClassCastException
- 형 변환은 부모 클래스와 자식 클래스간에 발생하고 구현 클래스와 인터페이스 간에도 발생합니다. 이
러한 관계가 아니라면 다른 클래스로 타입을 변환할 수 없습니다.
위 내용 외에도 예외 종류는 엄청 많다.
예외의 종류 까진 외울 필요는 없다. 
하지만 이런 실행예외들은 개발자의 경험에 의해서 예외 처리 코드를 삽입해야 한다
(많이 고쳐본 사람이 잘 고치게 된다. 스스로의 문제를 해결하는 힘이 길러지는 것.)

오류 발생시 검색하고 참고할 싸이트.
https://stackoverflow.com/

예외처리 방법1 (try~catch~finally)
참고 : day10.exception.trycatch.TryCatchEx01 ,day10.exception.trycatch.TryCatchEx03 , Quiz16
* try~ catch~ finally
- - try 블록에는 예외 발생 가능성이 있는 코드를 작성합니다. try 블록의 코드가 예외 발생 없이 정상 실
행되면 catch 블록은 실행되지 않습니다.
- - try 내부에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행합
니다.
- 예외 발생 여부와 상관없이 항상 실행할 내용이 있다면 finally 블록 내부에 실행 내용을 작성합니다.

-★finally는 오류가 발생하던 하지않던 무조건 실행을 해줘야 한다고 처리하는 것이다.


다중 catch(둘 이상의 예외 처리)
* 다중 catch
- try 블록 내부는 다양한 종류의 예외가 발생할 수 있습니다. 예외가 여러 가지 발생한다면 다중 catch
블록을 작성하여 예외들을 처리합니다.
- catch 블록은 위에서부터 차례대로 검색되므로 상위 예외 클래스의 catch 블록이 위에 있다면 하위 예
외 클래스의 catch블록은 실행되지 않습니다.
- catch() 괄호 안에 동일하게 처리하고 싶은 예외를 | 로 연결하면 됩니다. 이 방식을 사용할 때는 두 예
외가 상속 관계가 있으면 안됩니다.



예외 처리 클래스도 상속 관계를 가진다
Error 클래스를 상속하는 예외 클래스의 예외 상황은 시스템 오류 수준의 예외 상황으로 프로그램 내에서 처리 할 수
있는 수준의 예외가 아니다. (심각한 에러)



예외처리 방법1 (예외 떠넘기기)-> 메서드 안에서의 예외처리를 말함.
* throws 
참고: day10.exception.throws_
-사용예시 :
 public static void calc(int num) throws ArithmeticException{}
 public static void greeting(int index) throws Exception{}
- try ~catch 구문이 예외가 발생했을 때 직접 해결을 하고자 하는 코드라면 throws는 메서드나 생성자
를 호출한 곳으로 예외를 떠넘기는 코드입니다.
- 즉 예외처리를 직접 수행하지 않고 메서드 호출자에게 예외를 던지는 방법입니다.
- throws 키워드가 붙어있는 메서드는 반드시 try 블록 내부에서 호출되어야 합니다. 그리고 catch블록
에서 떠넘겨 받은 예외를 처리해야 합니다.
- main도 thorws를 사용할 수 있습니다
-★★★ throws 와 try,catch 구문의 차이 ★★★
 메서드에서 throws 해버리면 오류발생시 그 자리에서 바로 메서드를 종료.
 반대로 try,catch구문으로 처리하면 메서드는 그대로 실행 된다고 생각하면됨.
 이 차이점을 인지하고 있기. 둘이 적절하게 많이 쓰임.
참고 : day10.exception.throws_ThrowsEx02

 


★★★
e.printStackTrace();
예외처리를 하면 예외의 내용을 알수가 없기 때문에,
예외의 내용을 확인하기 위해서 catch영역에서는 항상 사용합니다.


예외 강제 발생 시키기

-많이 사용되는 것은 아님.
참고1 : day10.exception.throw_.ThrowEx01 

package day10.exception.throw_;

public class ThrowEx01 {
	
	public static void main(String[] args) {
		
		try {
			System.out.println(calc(10));
			System.out.println(calc(-10));
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(e.getMessage());//예외 생성시에 만들어진 메시지를 확인할 수 있음.
		}
		
	}
	
	//잘못된 값이 전달되면 예외를 만들어서 메서드를 강제종료
	public static int calc(int n) throws Exception{
		
		if(n <= 0) {
			throw new Exception("0이상으로 값을 전달하세요"); //예외 강제생성 - 예외를 생성하면 예외처리 구문이 필요합니다
			//return ??;
		}
		
		int sum = 0;
		for(int i = 0; i <= n; i++)
			sum += i;
		
		return sum;
	}
	
	
}


 Quiz16.Calculator ,  MainClass2(실습 문제) -> 사용이 아직 익숙하지 않으니 꼭 다시 살펴보기. (아래쪽 코드블럭 확인.)
 스캐너를 사용하는 또 다른 구문 자주나오는 표현방식이니까 눈여겨봐두기.
- 사용자가 직접 선언한 예외 클래스나 자바가 제공하는 예외 API에서 예외를 강제 발생시키려면 throw라
는 키워드를 이용합니다.
- 예외를 강제 발생시키며 메서드를 강제 종료 합니다.
-e.printStackTrace(); 오류내용을 나타내줌.
 e.getMessage() 내가 써놓은 오류 메세지를 전달해줌.

 

Quiz16 calcjlator 실습 내용. 

package Quiz16;

import java.util.Scanner;

public class Calculator {
	
	
	public static int input() throws Exception {
		
		/*
		 * 1. 스캐너로 정수 2개를 입력을 받습니다.
		 * 2. 입력된 값이 정수라면 합계를 반환합니다.
		 * ★3. 예외가 발생될 수 있는 상황이라면 throw를 이용해서 메서드를 종료하고 예외메시지를 전달해주면 됩니다.
		 * ★4. scan.close() 는 finally 문장에서 사용하세요
		 */
		//중괄호 안에서 사용된 구문은 중괄호 안에서만 유효하기 떄문에 트라이문 밖에 스캐너 생성
		//Scanner scan = new Scanner(System.in);
		
		Scanner scan = null; // 이건 스캐너를 생성하는 또 다른 방법. 
		//이런 표현도 자주나오니까 익숙해지기.
		try {
			scan = new Scanner(System.in);
			int a = scan.nextInt();
			int b = scan.nextInt();
			return a+b;
		} catch (Exception e) {
			throw new Exception("숫자로 입력해야지 인마");//예외생성
		} finally {
			scan.close();
		}
	}

}
package Quiz16;

public class MainClass2 {
	
	public static void main(String[] args) {
		
		try {
			Calculator.input();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
		
	}//main

}//class




출력 :
i (입력함)
java.lang.Exception: 숫자로 입력해야지 인마
	at Quiz16.Calculator.input(Calculator.java:26)
	at Quiz16.MainClass2.main(MainClass2.java:8)
숫자로 입력해야지 인마



교안 마지막에 사용자 정의 예외 이거는 만들일이 없어서 넘어감.

이렇게 자바교안 18강까지해서 자바의 기초문법을 다 배움. 총12가지.
자바교안 19강부터는 자바를 잘 활용하는 방법들을 배우게 될 것.

자바교안 19강 API – java.lang패키지



<오늘 기억할 내용>
-원인을 찾을 때 검색키워드를 어떻게 할지도 중요함. 딱 명사만 이용해서 검색을 해야하는 것임.
-엔터개행이란? day10.exception.trycatch.TryCatchEx03 참고.
-상속관계 볼수 있는 단축키:ctrl + t ( 해당 키워드에 클릭 한번하고 단축키 누르기)
-catch 구문에서 catch(오류종류). 소괄호 안에 오류가 상속관계에서 상위에 속할수록 
 아랫줄에 위치하게 해주어야함. (그래야 순서대로 각각에 오류들에 맞는 캐치구문을 실행할 수 있음.)
-main에 args 사용방법 -> run -> run configration -> argments탭에 -> ${string_prompt}  
 사실 사용할 일이 없긴함.  
 참고: https://sokkung.tistory.com/m/82 
      day10.exception.trycatch.MultiCatchEx01
 
 String[] args 
 run -> run configration -> argments탭에 -> ${string_prompt}