2017-03-31 10 views
0

아래는 해당 클래스 파일의 16 진수입니다. 이 코드가 실행되지 않는 이유에 대해 잘 모르겠다. java.lang.ClassFormatError : java fibo를 사용하여 터미널에서 실행될 때 코드 세그먼트 fibo 클래스 파일의 길이가 잘못되었습니다. 전문 지식을 가진 사람이 코드 길이가 잘못된 이유를 이해합니까?코드 길이가 잘못되어 결과를 출력하지 않는 클래스 파일이 있습니다

 

    //source code as requested 
      public class fibo{ 

      public static void main(String args[]){ 
       System.out.println(fibonacci(10)); 
      } 

     public static int fibonacci(int n) { 
       if(n == 0) 
        return 0; 
       else if(n == 1) 
        return 1; 
       else 
        return fibonacci(n - 1) + fibonacci(n - 2); 
      } 
 
ca fe ba be 00 00 00 34 00 1f 0c 00 19 00 1e 01 
00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 
74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f 
6c 61 6e 67 2f 4f 62 6a 65 63 74 01 00 06 3c 69 
6e 69 74 3e 07 00 03 0c 00 04 00 0a 07 00 13 0a 
00 07 00 1c 01 00 09 66 69 62 6f 2e 6a 61 76 61 
01 00 03 28 29 56 07 00 16 01 00 04 43 6f 64 65 
01 00 04 66 69 62 6f 01 00 04 6d 61 69 6e 01 00 
0d 53 74 61 63 6b 4d 61 70 54 61 62 6c 65 09 00 
0b 00 01 01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
01 00 04 28 49 29 56 01 00 13 6a 61 76 61 2f 69 
6f 2f 50 72 69 6e 74 53 74 72 65 61 6d 01 00 07 
70 72 69 6e 74 6c 6e 0a 00 05 00 06 01 00 10 6a 
61 76 61 2f 6c 61 6e 67 2f 53 79 73 74 65 6d 01 
00 04 28 49 29 49 0c 00 1b 00 17 01 00 03 6f 75 
74 07 00 0d 01 00 09 66 69 62 6f 6e 61 63 63 69 
0c 00 14 00 12 0a 00 1a 00 18 01 00 15 4c 6a 61 
76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 
6d 3b 00 21 00 1a 00 05 00 00 00 00 00 03 00 01 
00 04 00 0a 00 01 00 0c 00 00 00 11 00 01 00 01 
00 00 00 05 2a b7 00 15 b1 00 00 00 00 00 09 00 
0e 00 02 00 01 00 0c 00 00 00 18 00 02 00 01 00 
00 00 0c b2 00 10 10 0a b8 00 1d b6 00 08 b1 00 
00 00 00 00 09 00 1b 00 17 00 01 00 0c 00 00 00 
37 00 03 00 01 00 00 00 1b 1a 9a 00 05 03 ac 1a 
04 a0 00 05 04 ac 1a 04 64 b8 00 1d 1a 05 64 b8 
00 1d 60 ac 00 00 00 01 00 0f 00 00 00 04 00 02 
06 06 00 01 00 11 00 00 00 02 00 09 
+0

처음에이 클래스 파일을 어떻게 가져 왔습니까? 결과를 덤핑하는 것이 아니라 잘못된 코드를 생성하는 [mcve]를 제공하는 것이 더 명확합니다. –

+1

나는 출력을 보지 않을 것이다; 그러나 방법에 당신이 그것을 창조 한 방법. – GhostCat

+0

@ 존 쉘 ... 작은 부탁을해도 될까요? – GhostCat

답변

0

클래스 파일은 나쁘다. 소스를 원하는 IDE에 복사하고 (일반적으로 빌드, 실행 또는 프로젝트라는 메뉴에서) 다시 빌드하십시오.

소스 코드를 가져 와서 마지막에 누락 된 중괄호를 추가하고 컴파일 한 다음 java fibo을 사용하여 실행했습니다. 정상적으로 작동했습니다. 자바 클래스는 대문자로 시작해야합니다.

+0

안녕하세요. 응답 해 주셔서 감사합니다. 그것에 대해 나쁘다는 것을 알고 있습니까? "코드 세그먼트의 길이가 잘못되었습니다". 당신이 생산 한 제품과 제 것을 비교한다면 제 문제가 무엇인지 말해 줄 수 있습니까? – user3255780

+1

이것이 반복되는 문제인 경우 Java 및 IDE를 다시 설치해야합니다. byte-for-byte 비교를 할 이유가 없습니다. 아마 아무런 도움이되지 않을 것입니다. 나는 여전히 당신이 원하는 컴파일 된 클래스를 게시 할 수 있지만 가치가있는 것이 무엇이 될지 의심 스럽다. 멀리 특정 오류로, 나는 문서를 검색하려고합니다. – ndm13

0

글쎄, 결국 그것은 1 바이트 밖에되지 않습니다. 예외로 알 수 있듯이 클래스 파일에 길이가 잘못된 Code 속성이 하나 있습니다. 길이가 올바르지 않다는 사실은 길이를 계산할 수있는 its internal structure에서 추론 할 수 있습니다. 내부 구조를 보지 않고 파서는 클래스 속성으로 잘못된 후속 바이트를 해석하여 메소드를 중단합니다.

클래스는 길이 55의 Code 속성을 갖는 하나 (16 진수 37)는 최종적으로 fibo 방법이어서 main있어서, 다음 컴파일러 생성 생성자 갖는다 49 (16 진수이어야 : 31). 따라서 16 진수 덤프에

 
ca fe ba be 00 00 00 34 00 1f 0c 00 19 00 1e 01 
00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 
74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f 
6c 61 6e 67 2f 4f 62 6a 65 63 74 01 00 06 3c 69 
6e 69 74 3e 07 00 03 0c 00 04 00 0a 07 00 13 0a 
00 07 00 1c 01 00 09 66 69 62 6f 2e 6a 61 76 61 
01 00 03 28 29 56 07 00 16 01 00 04 43 6f 64 65 
01 00 04 66 69 62 6f 01 00 04 6d 61 69 6e 01 00 
0d 53 74 61 63 6b 4d 61 70 54 61 62 6c 65 09 00 
0b 00 01 01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
01 00 04 28 49 29 56 01 00 13 6a 61 76 61 2f 69 
6f 2f 50 72 69 6e 74 53 74 72 65 61 6d 01 00 07 
70 72 69 6e 74 6c 6e 0a 00 05 00 06 01 00 10 6a 
61 76 61 2f 6c 61 6e 67 2f 53 79 73 74 65 6d 01 
00 04 28 49 29 49 0c 00 1b 00 17 01 00 03 6f 75 
74 07 00 0d 01 00 09 66 69 62 6f 6e 61 63 63 69 
0c 00 14 00 12 0a 00 1a 00 18 01 00 15 4c 6a 61 
76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 
6d 3b 00 21 00 1a 00 05 00 00 00 00 00 03 00 01 
00 04 00 0a 00 01 00 0c 00 00 00 11 00 01 00 01 
00 00 00 05 2a b7 00 15 b1 00 00 00 00 00 09 00 
0e 00 02 00 01 00 0c 00 00 00 18 00 02 00 01 00 
00 00 0c b2 00 10 10 0a b8 00 1d b6 00 08 b1 00 
00 00 00 00 09 00 1b 00 17 00 01 00 0c 00 00 00 
this byte should be 31 
↓ 
37 00 03 00 01 00 00 00 1b 1a 9a 00 05 03 ac 1a 
04 a0 00 05 04 ac 1a 04 64 b8 00 1d 1a 05 64 b8 
00 1d 60 ac 00 00 00 01 00 0f 00 00 00 04 00 02 
06 06 00 01 00 11 00 00 00 02 00 09 

이 바이트를 변경하면 클래스가 문제없이 작동합니다. 이 바이트가 어떻게 잘못되었는지는 문맥 없이는 말할 수 없습니다. 컴파일러는 일반적으로 올바른 바이트 코드를 생성해야하며 정상적인 컴파일러에서 이와 같은 종류의 오류가 발생하지 않았습니다.