무작정 개발.Vlog

[JAVA+국비교육] 예외 처리(Exception), 네이버 로그인 만들기

by 무작정 개발
반응형
2022.01.11(14일 차)

 

오늘은 드디어 기다리던 예외 처리(Exception handling)를 배운다. 어려울 것으로 예상되지만 파이팅!

 

오늘의 수업 내용

 

 

예외(Exception), 에러(Error)

예외(Exception)

  • 입력 값에 대한 처리가 불가능하거나, 프로그램 실행 중 참조된 값이 잘못된 경우 등 정상적인 프로그램의 흐름에 어긋나는 경우
  • 개발자가 예외 상황을 미리 예측하여 직접 핸들링 가능

에러(Error)

  • 시스템에 어떠한 비정상적인 상황이 발생한 경우
  • 주로 JVM에서 발생하며, 예외와 반대로 이를 애플리케이션 코드에서 잡으려고 하면 안 됨.

 

예외처리 목적

  • 예외 발생으로 인한 실행 중인 프로그램의 비정상 종료를 막기 위해
  • 개발자에게 알려 코드를 보완할 수 있도록 하기 위해

Java의 예외 클래스들 상속 관계도
Java의 예외 클래스들 상속 관계도

Java에서는 상속을 이용해 모든 예외를 표현하는데, 모든 예외 클래스는 Throwable의 자손 클래스이다.

 

try-catch(-finally) 형식

try {
    // 예외가 발생할 가능성이 있는 코드를 구현합니다.
} catch (FileNotFoundException e) {
    // FileNotFoundException이 발생했을 경우,이를 처리하기 위한 코드를 구현합니다.
} catch (IOException e) {
    // FileNotFoundException이 아닌 IOException이 발생했을 경우,이를 처리하기 위한 코드를 구현합니다.
} finally {
    // 예외의 발생여부에 관계없이 항상 수행되어야하는 코드를 구현합니다.
}

 

package com.day14;

import java.util.Scanner;

/* 예외 처리( try - catch 문)
Exception
*/
public class Test2 {

	public static void main(String[] args) {
		
		int num1, num2, result;
		String oper;
		
		Scanner sc = new Scanner(System.in);
		
		try {
			
			System.out.print("두 개의 수 : ");
			num1 = sc.nextInt();
			num2 = sc.nextInt();
			
			System.out.print("연산자 : ");
			oper = sc.next();
			
			result = 0;
			
			if(oper.equals("+")) { // oper은 String이라 equals로 비교
				result = num1 + num2;
			} else if (oper.equals("-")) {
				result = num1 - num2;
			} else if (oper.equals("*")) {
				result = num1 * num2;
			} else if (oper.equals("/")) {
				result = num1 / num2;
			}
			
			System.out.printf("%d %s %d = %d\n", num1, oper, num2, result);
			 //try에서 에러가 발생하면 catch문이 오류를 잡아내고 Exception이 오류처리한 결과를  매개변수 e한테 반환해줌
			
		} catch (NumberFormatException e) {
			System.out.println("정수를 입력해라");
			
		} catch (ArithmeticException e) {
			System.out.println("0으로 나눌 수 없습니다.");
			
		} catch (Exception e) { //Exception을 가장 위에 쓰면 에러뜸 why ? -> 위로 가면 아래 애들이 할일이 없어짐
			System.out.println("넌 그게 숫자로 보이냐~~?");
			System.out.println(e.toString());// 이걸 많이쓴다   java.util.InputMismatchException
			e.printStackTrace();
			
		} finally {
			System.out.println("언제든지 실행된다.");
		}
		
		System.out.println("catch문 밖....");
		
		
	}
}

 

Test 2 실행

 

 예외처리를 사용한 계산기 만들기

  • 예외를 의도적으로 발생시키는 방법( 자주 사용)
package com.day14;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 예외를 의도적으로 발생시키는 방법 ( 자주 사용함) 중요!!!
public class Test3 {
										//2
		public static String getOper() throws Exception {
			
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
			String oper = null;
			//String oper = ""; 위의 방법도 ㄱㅊ지만 보통 이방법으로 쓴다.
			
			try {
				
				System.out.print("연산자 : ");
				oper = br.readLine(); // 원래 에러뜨는데 catch문의 exception이 해결해줌
				
				if(!oper.equals("+") && !oper.equals("-") &&
						!oper.equals("*") && !oper.equals("/")) { // 양쪽이 부정이면 &&
					
					//사용자 정의 오류 -  위 문장이 아니면 오류를 발생시켜라.
					//사용자 정의를 사용하려면 이 문법을 사용하고 스로우 익셉션.
					throw new Exception("연산자 입력 오류!!"); //1. 선언 2.위 throws 익셉션이 두번째
				}
				
				
			} catch (IOException e) {
				System.out.println("입력 에러!!");
				
			}
			
			return oper; // oper를 반환
		}
		
		public static void main(String[] args) {
			
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
			int num1, num2, result;
			String oper;
			
			try {
				
				System.out.print("첫번째 수 : ");
				num1 = Integer.parseInt(br.readLine());
				System.out.print("두번째 수 : ");
				num2 = Integer.parseInt(br.readLine());
				
				oper = Test3.getOper();//3.오퍼에 객체생성을 할때 오류를 가져옴으로
				
				result = 0;
				
				if(oper.equals("+")) { // oper은 String이라 equals로 비교
					result = num1 + num2;
				} else if (oper.equals("-")) {
					result = num1 - num2;
				} else if (oper.equals("*")) {
					result = num1 * num2;
				} else if (oper.equals("/")) {
					result = num1 / num2;
				}
				
				System.out.printf("%d %s %d = %d\n", num1, oper, num2, result);
				
			} catch (Exception e) { //4.여기서 오류를 처리하고 스트링으로 출력한다.
				
				System.out.println(e.toString());
				
			}		
	}
}

Test 3 실행
Test 3 실행

 

 

package com.day16;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

//OutputStreamReaderWriter

public class Test4 {

	public static void main(String[] args) throws IOException {
		
		int data;
		System.out.print("문자열?");
		Reader rd = new InputStreamReader(System.in);
		Writer wr = new OutputStreamWriter(System.out);
		
		while((data = rd.read()) != -1) {
			
			wr.write(data);
			wr.flush();// flush() : 강제로 내보낸다.
		}
	}

}
반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기