Java

05.09 예외처리

amungstudy 2023. 5. 9. 16:01

throws : 예외 떠 넘기기

메소드 선언부 끝에 작성

 

package test2_throws;

 

public class ThrowsExample {

// throws : 예외 던지기. 메소드 호출하는곳에서 try-catch로 예외처리 해줘야 함.

public static void main(String[] args) // throws ClassNotFoundException

{

try {

findClass("java.lang.String");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

 

public static void findClass(String path) throws ClassNotFoundException {

// class의 위치 이름을 전달받아 클래스 설계정보를 저장하는 객체

Class<?> clazz = Class.forName(path);

}

 

}


package test3_throw_extends;

 

public class Account {

 

private long balance; // 잔고

 

// 입금

public void deposit(int money) {

balance += money;

}

 

// 출금

public void withdraw(int money) throws BalanceInsufficientException {

if(balance < money) {

String message = "잔고 부족 : " + (money - balance) + "원 모자람";

//throw new 예외객체("예외 메시지"): 예외 강제 발생시키는것. > 이런 상황에서 이런 예외 발생할 수 있으니까

// 메소드 호출하는 곳에서 예외처리 해줘야한다고 알림.

// message : 예외처리시 e.getMessage()에 쓰임

throw new BalanceInsufficientException(message);

/*

System.out.println(message);

return;

*/

}

balance -= money;

 

}

}


package test3_throw_extends;

//extends Exception : 예외객체 만들기

public class BalanceInsufficientException extends Exception{

 

public BalanceInsufficientException (String message) {

super(message);

}

}


package test3_throw_extends;

 

import java.util.Scanner;

 

// 간단하게 예금을 입금 출금하는 프로그램

public class AccountExample {

 

public static void main(String[] args) {

Account account = new Account();

account.deposit(10000);

try (Scanner sc = new Scanner(System.in)) {

while(true) {

System.out.println("출금할 금액을 입력해 주세요.");

int money = sc.nextInt();

 

//alt + s + w : try-catch 블록지정

try {

account.withdraw(money);

break;

} catch (BalanceInsufficientException e) {

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

continue;

}

 

}// end while

//sc.close();// 자기랑 연결된 자원 해제

}

} // end main

 

}


Class 클래스(reflect pkg, 직접 사용하는 경우는 드물다... )

 

package b_class;

 

public class Person {

 

public static String addrress;

private String name;

private int age;

 

public Person() {}

 

public Person(String name) {

this.name = name;

}

 

public Person(String name, int age) {

this.name = name;

this.age = age;

}

 

//getter setter toString

public static String getAddrress() {

return addrress;

}

 

public static void setAddrress(String addrress) {

Person.addrress = addrress;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public int getAge() {

return age;

}

 

public void setAge(int age) {

this.age = age;

}

 

// alt + s + s + s

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + "]";

}

}


package b_class;

 

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

 

public class ClassExample {

 

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

// Class - Class 또는 생성된 인스턴스의

// 설계정보를 알려주는 객체

 

// 1. class의 정적 멤버 class

// class의 설계정보가 메모리에 올라갈 때 class의 설계 정보를 저장

Class<Person> pClass1 = Person.class;

//class의 이름 정보(package를 포함하는 class의 전체 이름)

System.out.println(pClass1.getName());

 

// 2. 생성된 instance의 부모(Object)의 getClass() 함수 이용

Person person = new Person("a",12);

System.out.println(person);

 

Class<?> pClass2 = person.getClass();

System.out.println(pClass2.getName());

 

// 3. Class의 정적 멤버 forName(class이름)를 이용 (자주 사용)

Class<?> pClass3 = Class.forName("b_class.Person");

System.out.println(pClass3.getName());

System.out.println(pClass3.getSimpleName());

System.out.println(pClass3.getPackageName());

System.out.println(pClass3.getPackage().getName());

 

// class에 정의된 Field(전역변수) 정보

// 선언된 모든 필드에 대한 정보를 배열로 반환

// java.lang.reflect.Field

Field[] fields = pClass3.getDeclaredFields();

System.out.println("Fields==================================");

for(Field f : fields) {

// field 접근 제어자(static final 등도 포함)

System.out.print(Modifier.toString(f.getModifiers())+"\t");

// field 데이터 타입

System.out.print(f.getType().getSimpleName()+"\t");

// field 이름

System.out.println(f.getName());

}

 

// 생성자

 

System.out.println("Constructor ====================");

Constructor<?>[] cons = pClass3.getDeclaredConstructors();

for(Constructor<?> c : cons) {

System.out.print(c.getName()+"(");

Class<?>[] types = c.getParameterTypes();

for(int i = 0; i<types.length;i++) {

System.out.print(types[i].getName()+" ");

}

System.out.println(")");

}

 

// method

System.out.println("Methods =====================");

// java.lang.reflect.Method

Method[] methods = pClass3.getDeclaredMethods();

System.out.println(methods[0]);

for(Method m : methods) {

System.out.println(m);

System.out.print(Modifier.toString(m.getModifiers())+"\t");

System.out.print(m.getReturnType()+"\t"+m.getName());

System.out.print("(");

Class<?>[] types = m.getParameterTypes();

for(int i = 0; i<types.length;i++) {

if(i != 0 ) System.out.print(", ");

System.out.print(types[i].getName());

}

System.out.println(")");

}

// Class는 class의 설계 정보를 가지고 있으므로 인스턴스 생성이 가능함.

// ClassNotFoundException은 throws

Class<?> clazz = Class.forName("b_class.Person");

try {

//객체생성 1번째 방법 (기본생성자로 생성)

Person p = (Person)clazz.newInstance();

p.setAge(35);

p.setName("최기근");

System.out.println(p);

 

//객체생성 2번째 방법. 매개변수 있는 객체 생성시에도 사용가능.

Person p1 = (Person)clazz.getConstructor().newInstance();

System.out.println(p1);

Person p2 = (Person)clazz.getConstructor(String.class).newInstance("최기근");

System.out.println(p2);

Person p3 = (Person)clazz.getConstructor(String.class, int.class)

.newInstance("최기근",28);

System.out.println(p3);

} catch (InstantiationException e) {

// 객체 설계 정보는 있으나 객체 생성이 불가능 할때 발생하는 오류

// 추상클래스, 인터페이스 이러한 설계 정보를 가진 Class는

// 자체만으로 객체생성이 불가능 하므로 발생하는 오류

} catch (IllegalAccessException e) {

// class정보도 존재하고 객체생성이 가능한 일반 클래스 이지만

// 객체를 생성하기 위해 생성자를 호출할 수 없다. ex> default 생성자만 존재하는 경우

// 접근 제한자(접근제어자)

} catch (IllegalArgumentException e) {

// 동일한 타입의 인자값이 전달되지 않았을때 발생하는 오류

// String int인데 int int 타입의 매개변수를 전달했을 경우

} catch (InvocationTargetException e) {

// 설계 정보가 잘못 되었을 경우 발생하는 오류

} catch (NoSuchMethodException e) {

// 동일한 매개변수를 가진 생성자를 찾지 못했을 때 발생

} catch (SecurityException e) {

// ?

e.printStackTrace();

}

 

 

}// end main

 

}


 

Objects 클래스

Object의 유틸리티 클래스

package a_objects;

 

import java.util.Objects;

 

class A{}

 

public class ObjectsExample {

 

public static void main(String[] args) {

 

A a = null;

A a1 = null;

 

// a는 null 인가? true : false;

boolean isChecked = Objects.isNull(a);

System.out.println(isChecked);

System.out.println("1========================");

 

// a1은 널이 아닌가? true : false

isChecked = Objects.nonNull(a1);

System.out.println("2========================");

 

//System.out.println(a.equals(a1));

isChecked = Objects.equals(a, a1); //null 도 비교가능

System.out.println("3========================");

 

A c = new A();

A d = c;

isChecked = Objects.equals(a1, c);

System.out.println(isChecked);

System.out.println("4========================");

isChecked = Objects.equals(d, c);

System.out.println(isChecked);

System.out.println("5========================");

 

int[] arr1 = {1,2,3,4,5};

int[] arr2 = {1,2,3,4,5};

isChecked = Objects.equals(arr1, arr2);

System.out.println(isChecked);

System.out.println("6========================");

 

//해당 배열의 항목의 값 비교

isChecked = Objects.deepEquals(arr1, arr2);

System.out.println(isChecked);

System.out.println("7========================");

// null.toString()

// System.out.println(a1.toString()); //NullPointerException발생

System.out.println(a1);

System.out.println(Objects.toString(arr2));

System.out.println(Objects.toString(a)); //오류없이 출력 가능

System.out.println(Objects.toString(a,"a 는 참조하는 값이 없습니다.")); // null인 경우 default값 지정

System.out.println(Objects.toString(c,"c 는 참조하는 값이 없습니다."));

}

 

}


String 메소드

package c_string.method;

 

public class String01CharAtLengthExample {

 

public static void main(String[] args) {

// CharAt(인덱스) - 문자열을 문자타입의 배열로 지정 후

// 각 인덱스에 저장된 하나의 문자를 반환

String rrn = "010624-1230123";

char gender = rrn.charAt(7);

switch(gender) {

case '1' : case '3':

System.out.println("남성입니다.");

case '2' : case '4' :

System.out.println("여성입니다.");

case '5' : case '7' :

System.out.println("외국인 남성입니다.");

case '6' : case '8' :

System.out.println("외국인 여성입니다.");

default :

System.out.println("1900년 이전 출생자 입니다.");

}// end switch

 

// "문자열".length() - 문자가 몇개인지 개수를 반환

rrn="8206071123456";

int length = rrn.length();

System.out.println("rrn 길이 : "+length);

if(length == 13) {

System.out.println("올바른 주민등록번호 길이입니다.");

}

 

}//end main

 

}


 

package c_string.method;

 

public class String02indexOfExample {

 

public static void main(String[] args) {

 

// method를 호출한 문자열에서

// 매개변수로 전달한 문자열이 몇번째 인덱스에 위치하고 있는지

// 인덱스 번호를 반환

// 해당되는 값이 없으면 -1을 반환

String str = "자바 프로그래밍을 자바!";

int location = str.indexOf("프로그래밍");

System.out.println("location : "+location);

 

if(str.indexOf("자바") != -1) {

System.out.println("자바가 존재합니다.");

}else {

System.out.println("자바가 존재하지 않습니다.");

}

 

System.out.println(str.indexOf("자바"));

//lastIndexOf 후미에서 부터 검색

System.out.println(str.lastIndexOf("자바"));

}

 

}


 

package c_string.method;

 

public class String03SubStringExample {

 

public static void main(String[] args) {

String rrn = "880815-1******";

int index = rrn.indexOf("-");

// substring(시작인덱스번호,끝인덱스번호 - 1)

String birthDay = rrn.substring(0,index);

System.out.println(birthDay);

// substring(시작인덱스번호)

// 해당 인덱스 위치부터 끝까지 문자열을 잘라냄

String last = rrn.substring(index+1);

System.out.println(last);

 

String fileName = "cat.png";

index = fileName.lastIndexOf(".");

String ext = fileName.substring(index);

System.out.println(ext);

}

 

}


 

package c_string.method;

 

import java.util.Scanner;

 

public class String04CaseTrimExample {

 

public static void main(String[] args) {

// case 함수 - 저장된 알파벳 문자를 대문자 또는 소문자로 변경하여 저장

String str1 = "Java Programmming!";

String str2 = "JAVA Programmming!";

System.out.println(str1);

System.out.println(str2);

String lowerStr = str1.toLowerCase();

String upperStr = str2.toUpperCase();

System.out.println(lowerStr);

System.out.println(upperStr);

System.out.println(lowerStr.equals(str2.toLowerCase()));

 

// 대소문자 상관없이 문자만 고려

if (str1.equalsIgnoreCase(str2)) {

System.out.println("문자열이 같습니다.");

} else {

System.out.println("문자열이 같지 않습니다.");

}

 

// trim 함수 - 지정된 문자열 좌우에 있는 의미 없는 공백을 제거

String tel1 = " 02";

String tel2 = "1234 ";

String tel3 = " 5678 ";

String tel4 = " 010 9486 7166 ";

 

System.out.println(tel1.trim() + tel2.trim() + tel3.trim());

 

Scanner sc = new Scanner(System.in);

System.out.println("아이디를 입력해주세요 > ");

String id = sc.nextLine();

String ownerid = "id001";

if (id.trim().equals(ownerid)) {

System.out.println("일치합니다.");

} else {

System.out.println("일치하지 않습니다.");

}

sc.close();

 

}

}