From 042608b88463af6a1ec3bef1afaf7f562443eb00 Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 11 Jul 2021 00:33:51 +0900 Subject: [PATCH 1/2] item69 --- ...4_\352\271\200\355\230\225\354\244\200.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 "10\354\236\245/69_\354\230\210\354\231\270\353\212\224_\354\247\204\354\247\234_\354\230\210\354\231\270_\354\203\201\355\231\251\354\227\220\353\247\214_\354\202\254\354\232\251\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" diff --git "a/10\354\236\245/69_\354\230\210\354\231\270\353\212\224_\354\247\204\354\247\234_\354\230\210\354\231\270_\354\203\201\355\231\251\354\227\220\353\247\214_\354\202\254\354\232\251\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" "b/10\354\236\245/69_\354\230\210\354\231\270\353\212\224_\354\247\204\354\247\234_\354\230\210\354\231\270_\354\203\201\355\231\251\354\227\220\353\247\214_\354\202\254\354\232\251\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" new file mode 100644 index 0000000..402e5c7 --- /dev/null +++ "b/10\354\236\245/69_\354\230\210\354\231\270\353\212\224_\354\247\204\354\247\234_\354\230\210\354\231\270_\354\203\201\355\231\251\354\227\220\353\247\214_\354\202\254\354\232\251\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" @@ -0,0 +1,35 @@ +# Item63 예외는 진짜 예외 상황에만 사용하라 + + try { + int i = 0; + while(true) { + range[i++].climb() + } + } catch (ArrayIndexOutOfBoundsException e) { + } + +해당 코드의 문제점은 무엇일까? +- 해당 코드는 무슨일을 하는 코드인지 알 수가 없다. +- 무한루프를 돌다가 배열의 끝에 도달해 ArrayIndexOutOfBoundsException이 발생해야 끝이난다. + +> 첫 번째 예시에서는 왜 Exception을 던져줬을까? 바로 JVM에서 배열에 접근할 때마다 경계를 넘지 않는지 검사하는데, 일반적인 반복문도 배열 경계에 도달하면 종료된다는 희망에 던져졌을 것이라고, 책에서 말해준다. +> 하지만, 책에서는 세가지면에서 잘못 된 추론이라고 한다. +> 1. 예외는 예외 상황에 쓸 용도로 설계되었으므로 예외에서는 최적화에 별로 신경 쓰지 않았을 가능성이 크다. +> 2. 코드를 try-catch블록 안에 넣으면 JVM이 적용할 수 있는 최적화가 제한 된다. +> 3. 배열을 순회하는 표준 관용구는 앞서 걱정한 중복 검사를 수행하지 않는다. JVM이 알아서 최적화해 없애준다. + + +해당 코드를 다시 리팩토링 한다면, + + for (Mountain m : range) { + m.climb(); + } + +아래와 같은 장점을 가지게 된다. +- 무슨일을 하는 코드인지 직관적이게 확인할 수 있다. +- forLoop가 끝나면 해당 코드는 끝나기 때문에 불필요한 Exception을 던질 필요가 없다. + +요번 아이템은 바로 장점 중에 두번째에 해당하는 Exception에 올바른 쓰임에 대해 2가지 항목으로 정리하며 끝내고 있다. + +1. 예외는 오직 예외 상황에서만 써야 한다. 절대로 첫번째 예시처럼, 일상적인 제어 흐름용으로 쓰여선 안된다. +2. 잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야한다. From 4b5b54592a0f9d099dbccced05b54b6f1cb5dbc2 Mon Sep 17 00:00:00 2001 From: Flamme1004K <50702723+Flamme1004K@users.noreply.github.com> Date: Sun, 18 Jul 2021 21:33:52 +0900 Subject: [PATCH 2/2] =?UTF-8?q?Update=2069=5F=EC=98=88=EC=99=B8=EB=8A=94?= =?UTF-8?q?=5F=EC=A7=84=EC=A7=9C=5F=EC=98=88=EC=99=B8=5F=EC=83=81=ED=99=A9?= =?UTF-8?q?=EC=97=90=EB=A7=8C=5F=EC=82=AC=EC=9A=A9=ED=95=98=EB=9D=BC=5F?= =?UTF-8?q?=EA=B9=80=ED=98=95=EC=A4=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/10\354\236\245/69_\354\230\210\354\231\270\353\212\224_\354\247\204\354\247\234_\354\230\210\354\231\270_\354\203\201\355\231\251\354\227\220\353\247\214_\354\202\254\354\232\251\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" "b/10\354\236\245/69_\354\230\210\354\231\270\353\212\224_\354\247\204\354\247\234_\354\230\210\354\231\270_\354\203\201\355\231\251\354\227\220\353\247\214_\354\202\254\354\232\251\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" index 402e5c7..bd84235 100644 --- "a/10\354\236\245/69_\354\230\210\354\231\270\353\212\224_\354\247\204\354\247\234_\354\230\210\354\231\270_\354\203\201\355\231\251\354\227\220\353\247\214_\354\202\254\354\232\251\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" +++ "b/10\354\236\245/69_\354\230\210\354\231\270\353\212\224_\354\247\204\354\247\234_\354\230\210\354\231\270_\354\203\201\355\231\251\354\227\220\353\247\214_\354\202\254\354\232\251\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" @@ -1,4 +1,4 @@ -# Item63 예외는 진짜 예외 상황에만 사용하라 +# Item69 예외는 진짜 예외 상황에만 사용하라 try { int i = 0;