개발하는 삶
[Java] 예외, 래퍼 클래스 본문
예외와 예외클래스
- 에러 : JVM 실행에 문제가 생겼다는 뜻
- 예외 : 사용자의 잘못된 조작/개발자의 잘못된 코딩으로 인해 발생하는 오류
- 모든 예외는 예외처리가 필요하다
- 모든 예외클래스는 java.lang.Exception 클래스를 상속받음
NullPointerException
- 객체가 없는 상태(null)에서 객체를 사용하려 하면 예외 발생
ArrayIndexOutOfBoundsException
- 배열에서 인덱스 범위를 초과하여 사용할 때 예외 발생
NumberFormatException
- 문자열 내에 숫자로 변환 될 수 없는 문자가 포함될 때 예외 발생 ("a100" 과 같은것)
ClassCastException
- 상위클래스 - 하위클래스, 인터페이스 - 구현클래스 관계가 아닌데 형변환 할 때 예외 발생
예외처리
try { // if문과 달리 {}괄호 생략 불가
//예외가 발생 가능한 문장들
} catch (Exception e1) { //e1는 참조변수를 의미
// Exception1이 발생할 경우, 처리하기 위한 문장
} catch (Exception e2) {
//..
} catch (Exception e3 | Exception e4) { //catch를 여러개 쓰고싶다면 |을 활용!
//..
} finally { //예외처리를 떠나 무조건 실행되는 문장
//..
}
리턴타입 메소드명(매개변수) throws 예외클래스1, ... { //예외클래스 여러개도 가능
}
//예외처리 불러오기
public void method1 throws ClassNotFoundException {
method2();
}
//예외 발생시키기
throws new XXXException(); //사용자 정의 예외발생
//try-catch 문으로 예외를 처리하기보단 예외를 호출한 곳에서 throws로 예외를 떠넘긴다
public void method() throws XXXException {
throw new XXXException("메세지");
}
사용자 정의 예외처리
- 자바 표준 API에 없는 예외를 사용자가 정의해 처리하는 것
public class XXXException extends [Exception | RuntimeException]{
//보통 생성자 2개를 선언 (기본생성자,
//예외메세지를 전달하기 위한 String타입의 매개변수를 갖는 생성자)
}
printStackTrace()
- 예외발생 당시에 호출스택에 있었던 메서드의 정보와 예외 메세지를 화면에 출력한다
- a.printStackTrace()
getMessage()
- 발생한 예외 클래스의 인스턴스에 저장된 메세지를 얻을 수 있다
- a.getMessage()
래퍼 클래스
- 8개의 기본형 값을 감싸는 클래스
- 감싸고있는 기본타입은 외부에서 변경 불가능
- 8개의 기본 타입에 해당하는 데이터를 객체로 포장해줌
- boolean -> Boolean
- char -> character
- byte -> Byte
- short -> Short
- int -> Integer
- long -> Long
- float -> Float
- double -> Double
- 다시 기본타입으로 반환할때
- 기본타입명+Value() 호출
- obj.charValue()
- 문자열 -> 기본타입
- byte num = Byte.parseByte("10");
- int num = Integer.parseInt("10");
- 연산자 == != 보다는 equals() 메서드를 사용하자
- Integer obj1 = 300;
- Integer obj2 = 300; 일때
- obj1.equals(obj2) 으로 계산하기 = true
Random 클래스
- Random(5)
- Random random = new Random(5); //0~5 까지 수중에 하나 뽑아주는 랜덤객체 생성
- 메서드
- random.nextBoolean() //boolean타입의 난수를 리턴
- random.nextdouble() //double타입의 난수를 리턴
- random.nextInt() //int 타입의 난수를 리턴 (int 허용범위 안에있음)
- random.nextInt(n) //int 타입의 난수를 리턴 (0 <= 값 <n)
Optional <T>
- T 타입 객체의 래퍼클래스
- null을 직접 다루는 것은 위험함 - NullpointException이 발생할 수 있음
- null체크 - if문을 이용.(코드가 지저분해짐. -> 그래서 간접적으로 null을 다뤄야함)
- Optional 객체를 이용해 확인하기 (<T> = 모든 종류의 객체 저장 가능)
- 중간에 null인지 아닌지 확인하는 과정을 거친다
public final class Optional<T>{
private final T value; //T타입의 참조변수
...
}
- Optional <T> 객체 생성하기
- null 가능성이 있을 때, ofNullable() 을 사용
String str = "abc";
Optional<String> optVal = Optional.of(str) // 가능.
Optional<String> optVal = Optional.of("abc") // 가능.
Optional<String> optVal = Optional.of(null) // 불가능. NullPointerException이 발생
Optional<String> optVal = Optional.ofNullable(null) // 가능. null인지 확인하는 법.
- null 대신 빈 Optional <T> 객체를 사용하자
Optional<String> optVal = null; // null로 초기화는 바람직하지 않음.
Optional<String> optVal = Optional.<String>empty(); // 빈 Optional 객체로 초기화해야함
Optional<String> optVal = Optional.empty(); // 위와 의미는 같음. <String> 생략해도 됨
Optional<T> 객체의 값 가져오기
- get(), orElse(), orElseGet(), orElseThrow()
Optional<String> optVal = Optional.of("abc");
String str1 = optVal.get(); //optVal에 저장된 값 반환. null이면 예외발생. //잘 안씀.
String str1 = optVal.orElse(""); //optVal에 저장된 값이 null일 때는, "" 반환. //이걸 잘 씀.
String str1 = optVal.orElseGet(String::new); //람다식이 가능하다. 위랑 같음. //이걸 잘 씀.
String str1 = optVal.orElseThrow(NullPointerException::new); // null이면 예외발생. 예외지정가능. //잘안씀.
- isPresent() - Optional 객체의 값이 null이면 false, 아니면 true를 반환
if(Optional.ofNullable(str).isPresent()){
System.out.println(str); //null이면 false고, 아니면 true니 출력해라.
}
// ifPresent(Consumer) - null이면 아무런 동작 X, null이 아니면 작업 수행
Optional.ofNullable(str).ifPresent(System.out::println);
//str 값이 null이 아니면 출력해라
OptionalInt, OptionalLong, OptionalDouble
- 기본형 값을 감싸는 래퍼클래스
- Optional<T> 보다 성능이 좋아서 씀 (모든 객체를 다루다보니 성능이 떨어져서)
public final class OptionalInt {
private final boolean isPresent;
private final int value; //기본형 값
...
}
- OptionalInt 값 가져오기
- Optional<T> //get() : T 값을 반환
- OptionalInt //getAsInt() : int을 반환
- OptionalLong //getAsLong() : long을 반환
- OptionalDouble //getAsDouble() : double을 반환
- 빈 Optional 객체와의 비교 - isPresent()
//값이 같은 두 객체
OptionalInt opt = OptionalInt.of(0); //0을저장. 값=0
OptionalInt opt2 = OptionalInt.empty(); //0을저장. 했지만 실제로는 아무값도 저장 하지 않았음.
//또 값이 없기 때문에 출력하면 예외발생한다.
//둘을 구별하는법
System.out.println(opt.isPresent()) //값이 있으면 true
System.out.println(opt2.isPresent()) //값이 없으니 false (아무 값도 저장하지 않아서)
System.out.println(opt.equals(opt2)) //false.
Optional<T> Stream - filter(), map(), flatMap()
- stream 처럼 메서드 사용 가능
int result = Optional.of("123")
.filter(x->x.length()>0)
.map(Integer::parseInt).orElse(-1);
Optional<T> Stream - 최종 연산 메서드
- Optional <T> 를 결과로 반환하는 최종연산 메서드들
Optional<T> findAny()
Optional<T> findFirst()
Optional<T> max(Comparator<? super T> comparator)
Optional<T> min(Comparator<? super T> comparator)
Optional<T> reduce(BinaryOperator<? super T> accumulator)
'Java' 카테고리의 다른 글
[Java] 람다식 (0) | 2022.06.26 |
---|---|
[Java] 제네릭스 (0) | 2022.06.25 |
[Java] 스레드 (0) | 2022.06.21 |
[Java] Object, String 클래스 (0) | 2022.06.21 |
[Java] 상속, 인터페이스 (0) | 2022.06.19 |