[JAVA+국비교육] 예외 처리(Exception), 네이버 로그인 만들기
by 무작정 개발반응형
2022.01.11(14일 차)
오늘은 드디어 기다리던 예외 처리(Exception handling)를 배운다. 어려울 것으로 예상되지만 파이팅!
오늘의 수업 내용
예외(Exception), 에러(Error)
예외(Exception)
- 입력 값에 대한 처리가 불가능하거나, 프로그램 실행 중 참조된 값이 잘못된 경우 등 정상적인 프로그램의 흐름에 어긋나는 경우
- 개발자가 예외 상황을 미리 예측하여 직접 핸들링 가능
에러(Error)
- 시스템에 어떠한 비정상적인 상황이 발생한 경우
- 주로 JVM에서 발생하며, 예외와 반대로 이를 애플리케이션 코드에서 잡으려고 하면 안 됨.
예외처리 목적
- 예외 발생으로 인한 실행 중인 프로그램의 비정상 종료를 막기 위해
- 개발자에게 알려 코드를 보완할 수 있도록 하기 위해
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문 밖....");
}
}
예외처리를 사용한 계산기 만들기
- 예외를 의도적으로 발생시키는 방법( 자주 사용)
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());
}
}
}
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() : 강제로 내보낸다.
}
}
}
반응형
'Language > Java' 카테고리의 다른 글
[JAVA+국비교육] 입출력 Stream (0) | 2022.01.12 |
---|---|
[JAVA+국비교육] Thread (0) | 2022.01.11 |
[JAVA+국비교육] ArrayList, List, Map, Generic (0) | 2022.01.07 |
[JAVA+국비교육] 내부클래스(익명의, 무명의, Anonymous클래스), Vector (0) | 2022.01.06 |
[JAVA+국비교육] 추상 클래스, 인터페이스, 형변환(upcast, downcast) (0) | 2022.01.05 |
블로그의 정보
무작정 개발
무작정 개발