'Java'에 해당되는 글 1건

  1. 2008/06/17 [퍼온글] 이클립스 컴파일러의 만행(?) by sloth_chord


사용자 삽입 이미지


사용자 삽입 이미지
사용자 삽입 이미지


// 인터넷 모 게시판 Heart 유저의 글을 퍼온것임을 밝힙니다
// 디컴파일 그림은 그런데 유저의그림임을 밝힙니다
/*
인용시작


컴파일되지 않은 에러 코드는 버리면 되는데, 아무튼... 아랫글 때문에 알게 된 거.

http://gall.dcinside.com/list.php?id=programming&no=76505&page=1

interface AAA {
 void ccc();
 void ddd();
}

abstract class A implements AAA {
 public abstract void ccc();
 public abstract void ddd();
}

class B extends A {
 public void ccc() {
  System.out.println("Success");
 }
}

public class Test {
 public static void main(String ar[]) {
  AAA a = new B();
  //a.ccc();
  a.ddd();
 }
}

이 코드가 실행이 되니까 이클립스가 병맛이니 에러스킵이 되느니 하는 떡밥이 아래 있어서... 호기심에 조금 봤는데
javac로는 클래스가 컴파일에 실패하면 class 파일이 안 만들어지는데...
(이걸 아까 잠깐 헷갈려서 만들어진다고 했는데, 에러나는 클래스에 한해 안 만들어지네. -g를 해도 마찬가지...)
eclipse로 자동 빌드 걸면 만들어진다.(뭐, 수동도 만들어지겠지...)

그럼 문제는, 에러가 난 코드인데 어떻게 돌리려고 class 파일이 만들어지냐... 인데
저런 경우에는 B.class 내에

ddd 특문~ java/lang/Error 특문~ ! 특문~ Unresolved compilation problem:
 The type B must implement the inherited abstract method A.ddd()

이렇게 만들어지더라구. 디컴파일 해보지 않아도 ddd()를 호출하면 java.lang.Error를 throw 하겠구나 라는 느낌이지.
그리고 실행하면 역시나 빨간색으로

Unresolved compilation problem:
 The type B must implement the inherited abstract method A.ddd()

라고 나와. 실행은 가능한 코드가 되는거지.
a.ccc(); 를 실행하면 Success라고 아예 정상 실행이 되어 버려.

이클립스는 왜 에러난 코드인데 지가 에러처리(라고 하면 모한가?)까지 하면서 컴파일을 하는걸까?
class 파일에 심어놓은 에러를 보고 에디트창에서 출력해 주는게 아닐라나 하는 생각이 들어. 그리고 거기 외에는 마땅히 쓸 데도 없고...

음... 참고로 JDK는 1.6.0_06이고 eclipse는 3.3이야.

결론 : 꼼수쓰는 이클립스......................................... 라기보다는 일기는 일기장에

인용끝
*/

결론은 jdtCompilerAdapter.jar 가 컴파일러패키지이며

jre와 이클립스만 설치되구 javac가 없는 상태에서 컴파일해두 이 컴파일러로 컴파일이된다구 함

그리하여서 이클립스의 자체 컴파일러 패키지의 컴파일러가 throw해준게 원인으로 밝혀졌음


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by sloth_chord