1. 예외처리
package basic_html;
import java.util.*;
public class ex1 {
public static void main(String[] args) {
try { //프로세서를 실행하는 범위 파트
Scanner sc = new Scanner(System.in);
System.out.println("숫자를 입력해주세요 : ");
int b = sc.nextInt();
System.out.println(b);
}
//catch : 문제 발생시 실행되는 파트
catch (InputMismatchException ime) {
System.out.println("숫자만 입력하셔야지요");
}
catch (NumberFormatException ne) {
System.out.println("문자를 숫자로 변경하려 했음!!");
}
// Exception 오류는 백가지가 넘기때문에 그냥 이렇게 쓰기
catch (Exception e) { // Exception : 모든 유형의 오류 체크
System.out.println(e); // 무슨오류인지 모를땐 직접 찍어보기 -> 종류 확인
e.printStackTrace(); //오류 발생한 코드 라인을 체크
System.out.println("오류발생");
}
}
}
- Exception
- 1. 사용자가 입력실수로 인하여 잘못된 값을 입력하였을 경우
- 2. 개발자가 프로그램 오류시 정확한 오류를 파악하기 위한 수단
- 3. 강제 프로세서에 대한 정보수정 및 오류를 처리하기 위한 수단
- Exception(부모 클래스), NumberFormatException 등등 (자식 클래스)
- try ~ catch : 예외 처리 문법
- try : 프로세서를 실행하는 범위 파트
- catch : 문제 발생시 실행되는 파트
- Exception : 모든 유형의 오류 체크
- 특정 예외를 처리하고 싶을때는 catch(Exception e) 으로 써두고 직접 오류발생 시켜서 콘솔에 나온 예외를 복사해서 캐치조건문에 넣어서 하면됨
2. finally와 임시조치, 문자열 치환
package basic_html;
import java.util.Scanner;
public class ex2 {
public static void main(String[] args) {
ex2_box eb = new ex2_box();
eb.exbox(); //finally 사용방법
eb.exbox2(); //해당 오류 문제 발생시 문법에 대한 임시 조치 후 재실행
}
}
//예외처리 처리방법
class ex2_box{
//필드에는 try ~ catch 사용하지 않음
Scanner sc = null;
public void exbox() {
this.sc = new Scanner(System.in);
System.out.println("사용자 이름을 입력하세요 : ");
try {
String user = this.sc.next();
if(user.equals("")||user.equals(null)) {
System.out.println("사용자미입력");
}else {
System.out.println("연락처를 입력하세요 ('-' 없이 입력) : "); // int로 전화번호 받으면 번호 시작 맨앞 0이 없어져버림
Integer tel = this.sc.nextInt();
System.out.println(tel);
}
}
catch(Exception e) {
System.out.println(e);
}
finally { //finally는 try와 catch 실행시 무조건 실행되는 프로세서를 마치는 메소드
this.sc.close();
System.out.println("finally는 무조건 작동되는 메소드");
}
}
public void exbox2() {
String word = "abcdeefgABCDEFG";
//String reword = word.replace("e", "홍");
// String reword = word.replace("[a-d]", "홍"); //범위는 못잡는다
String reword = word.replaceAll("[a-dE-Fㄱ-ㅎㅣ-힇]", "홍"); //범위 잡을수있음
System.out.println(reword);
String a = "500a0";
int b = 0;
try {
b = b + Integer.parseInt(a);
}
catch(NumberFormatException ne) {
//해당 예외처리 구문이 발생될 경우 임시조치 코드를 작성 후 정상적으로 프로세서가 작동되도록 함
a = a.replaceAll("[a-z]",""); //a~z를 null로 바꿈
b = b + Integer.parseInt(a);
}
catch(Exception e) {
System.out.println(e);
}
System.out.println("최종 결과값 : "+b);
}
}
- finally : try와 catch 실행시 프로세서를 마치는 무조건 실행되는 메소드
- try ~ catch와 세트
- 스캐너 안닫으면 프로그램을 종료해도 계속 돌아감 -> 고스트 프로그램 -> finally로 스캐너 닫아주기
- catch구문 안에 임시 조치할 코드를 작성해서 프로세서가 작동되도록 함
- 문자열 치환 : 특정 단어를 다른 단어로 변경하는 기능을 가진 메소드
- replace() : 한글자 바꿀때
- replaceAll() : 글자의 범위를 지정해서 바꿀때
😊응용문제
사용자가 다음과 같이 은행에 금액을 입금하는 프로세서입니다.
문제가 발생시 숫자만 입력 받을 수 있도록 처리하는 예외처리 코드를 작성
[결과]
"입금하실 금액을 입력하세요 : " aaa
"숫자만 입력하세요"
"입금하실 금액을 입력하세요 : " 5000
"입금하신 금액은 5000원 입니다."
package basic_html;
import java.util.*;
public class ex3 {
public static void main(String[] args) {
ex3_bank eb = new ex3_bank();
eb.deposit();
}
}
class ex3_bank{
Scanner sc = null;
public void deposit() {
this.sc = new Scanner(System.in);
System.out.println("입금하실 금액을 입력하세요 : ");
int money = 0;
try {
money = this.sc.nextInt();
//출력이 catch아래에 있을 경우 재귀메소드를 이용했을때 출력이 재귀한만큼 나와버림 출력에 주의
System.out.println("입금하신 금액은 "+money+"원 입니다.");
}catch(InputMismatchException ime) {
System.out.println("숫자만 입력하세요");
deposit(); //문제 발생시 재귀메소드로 재호출
}
catch(Exception e){
System.out.println(e);
}
finally {
this.sc.close();
}
}
}
⭐️예외처리 주의할점 : 출력 코드가 어디에있냐에 따라 결과가 천차만별 !! 위치에 주의하자 !!
3. 범인찾기 throws, throw
package basic_html;
public class ex4 {
public static void main(String[] args) {
ex4_box eb = new ex4_box();
try {
eb.abc(100, "3 00");
}
catch(Exception e) {
System.out.println("A개발자 코드");
System.out.println(e);
try{ //실무에서 활용하는 법 : 다시 트라이해서 데이터 보내서 상대코드는 맞는지 확인함
eb.abc(500,"600");
}catch(Exception e2) {
System.out.println(e2);
}
}
//B개발자 쪽에서 문제가 발생시 확인하는 방법
try {
eb.bbb("5000"); //인자값을 태워 bbb메소드 호출
}catch(Exception e){
e.printStackTrace();
}
}
}
//B개발자 코드
class ex4_box{
public void bbb(String a) throws Exception, NumberFormatException{
int k = Integer.valueOf(a)+Integer.valueOf("200a");
System.out.println(k);
Exception ep = new Exception(); //Exception 라이브러리 사용
throw ep; //throw : return과 비슷한 성격. 가장 아래에 작성
}
public void abc(int no, String z) throws Exception {
int sum = no + Integer.parseInt(z);
System.out.println(sum);
}
}
- throws, throw : 외부 클래스에 있는 메소드를 호출, 전송 등 데이터 이관을 할 경우 문제점에 대한 정보를 서로 공유할 수 있도록 처리하는 메소드
- throws Exception : 메소드에 적용하면 해당 메소드 호출시 무조건 예외처리 기준방침을 적용 후 호출을 해야함
- throw : 예외처리가 발생되면 상대방에게 에러코드를 전송하며, 재전송을 요청할 수 있음
- return과 비슷한 성격
- 메소드의 가장 아래에 작성
😊응용문제
[결과]
포인트 전체 합계 : 90100
단, 해당 배열의 값을 전달할 경우 오류발생시 오류 처리에 관한 메세지 출력
[오류발생시]
"정상적인 데이터를 변환하지 못하여 서비스 오류가 발생하였습니다."
package basic_html;
public class ex5 {
public static void main(String[] args) {
String money[] = { "5,000", "6,500", "70,000", "3,400", "5,200" };
ex5_box eb = new ex5_box();
eb.sumPoint(money);
}
}
class ex5_box {
int sum = 0;
public void sumPoint(String[] money) {
int i = 0;
try {
while (i < money.length) {
this.sum += Integer.valueOf(money[i].replace(",", ""));
i++;
}
System.out.println("포인트 전체 합계 : " + this.sum);
} catch (Exception e) {
System.out.println("정상적인 데이터를 변환하지 못하여 서비스 오류가 발생하였습니다.");
}
}
}
⭐️⭐️⭐️⭐️⭐️예외처리 주의할점 : 출력 코드가 어디에있냐에 따라 결과가 천차만별 !! 위치에 주의하자 !!
이 문제 틀렸었다
틀린 데이터 직접 넣어보고 예외처리가 잘 되는지 체크하기!!!