본문 바로가기

JAVA

java09.exception

/*

예외(Exception)?

 

자바에서 응용프로그램의 오류ㅜ가 발생하는 것을 에러(Error)라고 한다. 에러는 JVM이 실행중에

문제가 발생하는 것으로 결국 프로그램의 실행이 불가능하게 된다. 이런 경우에 개발자는 픅로그램이

정상적으로실행될 수 있도록 해야 하는데 에러를 처리할 방법이 없다면 이를 대처할 수

없게된다.,

 

대부분의 프로그램 언어에서는 이런 에러이외에 예외(Exception)라고 불리는 오류가 있는데 예외란

사용자의 잘못된 조작 또느 개발자의 잘못된 코딩으로 발생하는 프로그램오류를 말한다.

 

예외가 발생하면 프로그램ㅇ느 곧바로 종료가 된다는 점에서 에러와 동일하지만 예외는 예외처리를

통해 프로그램을 종료하지 않고 정상적인 실행상태가 유지ㄷ 될 수 있도록 한다.

 

예외는 2가지 종류가 있는데 일반예외(Exception)와 실행예외(Runtime Exception)이 있다.

 

1. 일반예외

 

컴파일예외라고 한다. 자바소스를 컴파일하는 과정에서 예외처리코드가 필요한지 여부를 검사하기 때문이다.

만약, 예외처리코드가 없다면 컴파일에러가 발생한다.

 

 

2. 실행예외

컴파일과정에서 예외처리코드의 유무를 검사하지 않는 예외를 말한다. 실행예외는 자바컴파일러가

예외를 체크하지 않기 때문에 오로지 개발자의 경험에 의해서 예외처리를 해야한다.

만약, 개발자가 실행예외에 대한 처리를 하는 코딩을 하지 않았을 경우 해당예외가 발생하다면

프로그램은 곧바로 죵료가 된다.

 

일반 예외과 실행예외는 컴파일 시에 처리하는지 안하는지 차이일뿐 2가지 모두 예외처리가 필요하다.

자바에서는 예외를 클래스로 관리한다.

 

JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외클래스로 객체를 생성한다. 그런 뒤

예외처리코드에서 예외객체를 이용할 수 있다.

 

모든 예외클래스는 java.lang.Exception 클래스를 상속받는다. 일반예외와 실행예외클래스를 구분하는

방법은 일반예외는 Exception을 상속받지만 실행예외는 java.lang.RuntimeException을 상속받는다.

 

*/

public class NullPointException {

 

public static void main(String[] args) {

String data = null;

 

// java.lang.NullPointerException 예외는 객체의 참조가 없는 상태를 의미한다.

// 즉, 객체가 없는 상태에서 객체를 참조하려고 했기 때문에 예외가 발생하는 것이다.

System.out.println(data.toString());

 

System.out.println("중요처리로직 실행");

 

}

 

}

/*

프로그램을 개발하다 보면 문자열로 되어있는 숫자형 데이터를 숫자로 변환하는 경우가

자주 발생한다.문자열을 숫자로 변환할 때 해당 문자열이 숫자로 구성된 문자열이 아닐

경우 즉, 숫자로 변환할 수 없는 문자일경 경우 발생하는 예외이다.

 

문자열을 숫자로 변환방법

 

변환타입 메서드(매개변수)

-------- --------------------------------------------

int Integer.parseInt(String str)

double double.parseDouble(String str)

*/

public class NumberFormatExceptionMain {

 

public static void main(String[] args) {

String data1 = "100";

String data2 = "3.14";

 

int val1 = Integer.parseInt(data1);

double val2 = Double.parseDouble(data2);

System.out.println(val1);

System.out.println(val2);

System.out.println(data1+data2);

 

String data3 = "100a";

// int val3 = Integer.parseInt(data3);

int val3 = Integer.parseInt(data3,16);

System.out.println(val3);

 

val3 = Integer.parseInt(data3);

System.out.println(val3);

}

}

public class ArrayIndexOutOfBoundExceptionMain {

 

public static void main(String[] args) {

 

String data1 = args[0];

String data2 = args[1];

 

System.out.println(data1);

System.out.println(data2);

 

System.out.println(args[2]);

}

 

}

public class ClassCastExceptionMain {

 

public static void main(String[] args) {

Dog dog = new Dog();

changeDog(dog);

changeDog(new Cat());

}

 

private static void changeDog(Animal animal) {

System.out.println(animal.getClass());

Dog dog = (Dog) animal;

System.out.println(dog);

}

 

}

class Animal{}

class Dog extends Animal{}

class Cat extends Animal{}

Try-Catch구문 예외들

public class TryCatchMain1 {

 

public static void main(String[] args) {

 

// 1. 일반예외

// Class.forName()메서드는 해당클래스를 객체로 반환해주는 기능

// 즉, new객체생성연산자와 동일한 기능을 한다.

try {

Class _class = Class.forName("java.lang.Stringdd");

System.out.println("클래스를 찾았습니다");

} catch (ClassNotFoundException e) {

System.out.println("클래스를 찾지 못했습니다");

e.printStackTrace();

System.out.println(e.getMessage());

 

} System.out.println("중요로직처리");

}

}

public class TryCatchMain2 {

 

public static void main(String[] args) {

 

// 2. 실행예외

String data1 = null;

String data2 = null;

 

// java.lang.ArrayIndexOutOfBoundsException

try {

data1 = args[0];

data1 = args[1];

System.out.println("args.length = " + args.length);

} catch (ArrayIndexOutOfBoundsException e) {

System.out.println("args.length = "+ args.length+ ",실행매개변수가 부족합니다");

System.out.println(e.getClass());

e.printStackTrace();

System.out.println(e.getMessage());

return;

}

System.out.println();

 

System.out.println(data1+ ", "+data2);

 

try {

int val1 = Integer.parseInt(data1);

int val2 = Integer.parseInt(data2);

int result = val1 + val2;

System.out.println("val1+val2= "+(val1+val2));

}catch(NumberFormatException e){

System.out.println(data1+"또는"+data2+"는 숫자변환불가");

e.printStackTrace();

System.out.println(e.getMessage());

}

 

System.out.println("중요로직처리");

}

 

}

public class MultiCatchMain {

 

public static void main(String[] args) {

String data1 = null;

String data2 = null;

try {

data1 = args[0];

data2 = args[1];

int val1 = Integer.parseInt(data1);

int val2 = Integer.parseInt(data2);

int result = val1 + val2;

Class _class = Class.forName("java.lang.Stringxx");

// }

// catch (NumberFormatException e) {

// System.out.println(data1+"또는"+data2+"는 숫자변환안됨");

// }

// catch (ArrayIndexOutOfBoundsException e) {

// System.out.println("args.lengt=" +args.length+ "실행매개변수부족");

}

catch (ArrayIndexOutOfBoundsException|NumberFormatException e) {

System.out.println("예외발생");

}

catch (Exception e) {

e.printStackTrace();

System.out.println("예외가 발생했습니다!");

}

finally {

System.out.println("종료");

}

 

}

 

}

/*

예외를 떠넘기기(throws)

 

메서드 내부에서 예외가 발생핳ㄹ 경우 코딩을 할 때 try~catch로 예외처리를 하는 것이 기본이지만

경우에 따라서는 메서드를 호출할 곳으로 예외를 떠넘길 수가 있다.

이때 사용하는 명령이 "throws"이다. throws명령은 메서드 선언부에 작성되어 메서드에서 처리하지

않고 메서드를 호출한 곳으로 예외를 떠넘기는 역할을 한다.

 

throws 명령은 떠넘길 예외클래스를 콤마(,)로 구분해서 나열해 주면 된다. throws키워드가 붙어 있느 ㄴ

메서드는 반드시 try- catch블럭에서 떠넘겨 받은 예외처리를 해야 한다.

*/

public class ThrowMain {

 

public static void main(String[] args) {

// throw - 강제로 예외를 발생시키기

try {

throw new ClassNotFoundException();

// throw new Exception(); // 강제로 Exception 객체를 생성

} catch (Exception e) {

System.out.println("강제예외발생");

}

 

}

 

}

public class ThrowsMain {

 

public static void main(String[] args) throws Exception{

// Class _class = Class.forName("java.lang.Stringxx");

 

//String data = args[0];

// int val1 = Integer.parseInt("111a");

 

method();

}

 

private static void method() throws ClassNotFoundException {

Class _class = Class.forName("java.lang.Stringxx");

}

void method1() {

try {

method();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

은행 계좌 프로그램 예시

public class Account {

private int balance;

 

public int getBalance() {

return balance;

}

void 예금(int money) {

this.balance += money;

}

// public void 출금(int money) {

// if(balance < money) {

// System.out.println("잔액부족");

// }else {

// this.balance -= money;

// }

//

// }

public void 출금(int money) throws 잔액부족 {

if(balance < money) {

throw new 잔액부족("잔액부족 "+(money-this.balance)+"원 부족");

}else {

this.balance -= money;

}

}

}

public class AccountMain {

 

public static void main(String[] args) throws 잔액부족 {

Account account = new Account();

 

 

account.예금(1000000);

System.out.println("현재 계좌잔액 = "+ account.getBalance() +" 원");

account.출금(2000000);

System.out.println("현재 계좌잔액 = "+ account.getBalance() +" 원");

 

// throw new 잔액부족("현재잔액부족");

 

}

 

}

public class 잔액부족 extends Exception{

 

public 잔액부족() {}

public 잔액부족(String message) {

super(message);

}

}

'JAVA' 카테고리의 다른 글

java11.basic_API.Objects  (0) 2023.05.25
java11.basic_API  (0) 2023.05.25
java08.nested  (0) 2023.05.25
java07.interface  (0) 2023.05.25
java06.inheritance  (0) 2023.05.25