2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[item 71] 검사예외를 던지는 메서드 #156

Open NuhGnod opened 1 year ago

NuhGnod commented 1 year ago

P.393 검사 예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없기 때문에(아이템 45~48) ~ 제가 잘못이해하고 있는건가 싶네요. 검사예외를 던지는 메서드는 스트림에서 사용못한다는데, 예시를 들어봤습니다.

        numbers.stream().map(
                qw -> {
                    try {
                        check(qw);
                    } catch (IllegalArgumentException e) {
                        System.out.println("??");
                    }
                    return qw;
                }
        ).toArray();

    private static void check(int n) {
        if (n == 1) {
            throw new IllegalArgumentException();
        }
    }

저는 검사 예외를 try-catch 같이 직접 예외를 체크해주는 상황?이라고 이해했습니다. 그래서 위와같이 작성했는데 잘 동작합니다.

그래서 질문이 2가지가 나오네요.

  1. 검사 예외란?
  2. 검사예외가 제가 생각한 것이라면, 아이템45~48 에서 말했다는 상황은 무엇인가?
NuhGnod commented 1 year ago

이제보니 IllegalArgumentException은 비검사예외였네요. 그래도

private static void check(int n) throws IOException {
        throw new IOException();
    }

        numbers.stream().map(
                qw -> {
                    try {
                        check(qw);
                    } catch (RuntimeException e) {
                        System.out.println("??");
                    } catch (FileNotFoundException e) {
                        throw new RuntimeException(e);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                    return qw;
                }
        ).toArray();

처럼 검사예외를 던지는 메서드로 수정하여도 실행이 되더라구여 책에서는 무슨 상황을 말한걸까요?

gmelon commented 1 year ago

흠 그러게요 저렇게 try-catch를 람다 안에 넣지 않고 사용하는걸 '직접 사용' 한다고 표현한거려나요?

ssstopeun commented 1 year ago

예시로 들어주신거는 스트림안에서 검사예외를 던지는 경우를 나타내는 메서드를 작성해주셨는데 저는 검사예외를 던지는 그러니까 try-catch가 있는 메서드가 따로 있고 스트림안에서 이 메서드를 직접사용했는 경우를 생각했습니다.

package Item71;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class Test1 {

    public static void main(String[] args) {

        Person p1 = new Person(1);
        p1.setName("jieun");
        p1.setJob("developer");
        Person p2 = new Person(2);
        p1.setName("Stop");
        List<Person> people = Arrays.asList(p1,p2);
        people.stream()
                        .map(Person::haveJob1)
                                .forEach(System.out::println);

        people.stream()
                .map(Person::haveJob)    //컴파일 에러
                .forEach(System.out::println);
    }
    static class Person{
        private final int id;
        private String name;
        private String job;
        public Person(int id){
            this.id=id;
        }
        public void setName(String name){
            this.name=name;
        }
        public String setJob(String job){
            this.job=job;
        }
        public String haveJob1(){
            if(job==null){
                job = "default job";
            }
            return String.valueOf(id)+" "+name+" "+job;
        }
        public String haveJob() throws Exception {
            if(job==null){
                throw new Exception("직업을 입력하지 않았습니다.");
            }
            return String.valueOf(id)+" "+name+" "+job;
        }
    }

}

이런 상황을 생각해봤습니다.

image