| [ garbages ] in KIDS 글 쓴 이(By): ciecet (_) 날 짜 (Date): 2010년 11월 20일 (토) 오전 03시 19분 59초 제 목(Title): Re: Goto-less java considered harmful.. 주어진 인자가 잘못된 경우엔 IllegalArgumentException이라는 Runtime exception을 쓰는게 관례입니다. 거부감을 떠나서 그렇다는거고... Exception이라는게 항상 좋지는 않습니다. 통상적으로 잘 동작해야 하는 것들은 Exception을 던지는게 맞지만 (InputStream.read()) 실패할 확률이 높은 것들은 그냥 결과값을 받아서 검사하는게 낫거든요. (Map.get()이나 File.delete()등등.) 그리고 try..finally는 exception과 상관없이 사용할 수 있습니다. 개인적으론 예제의 error:대신 exit:를 쓰고, 여러 label을 사용할 상황이면 flag variable등을 둬서 exit: 한곳에서 모두 처리합니다. 그래서 try..finally와 잘 대응되더군요. do_job(param1, param2) { if (param1 <= 0 || param2 == null) { throw new IllegalArgumentException("param1 or param2 is invalid"); } NativeResource buf1 = null; NativeResource buf2 = null; try { buf1 = NativeResource.allocate(); buf2 = NativeResource.allocate(); if (buf1 == null || buf2 == null) { log("out of native resource"); return false; } return some_lib_func(buf1, buf2, param1, param2); } finally { if (buf1 != null) { buf1.dispose(); } if (buf2 != null) { buf2.dispose(); } } } Java에선 goto와 같은 망나니(?)를 억지로 사용하려면 아래와 같은 방법을 쓸 수는 있을 것 같아요... for (int nextRun = 1; nextRun != 0;) switch (nextRun) { case 1: { .... if (NG) { nextRun = 3; continue; // goto 3 } .... nextRun = 0; continue; // exit loop } case 2: { .... } case 3: { .... } } |