문제

다음 Java 코드 조각이 있습니다

while (condition1){
    switch (someinteger){
        case 1:
            if(condition2) continue;
            // other stuff here
            break;
        // other cases here
    }
}

모두 괜찮습니다. 클래스 파일을 생성 한 다음 무료 도구 (jd-gui)를 사용하여 디 컴파일하면 다음 코드를 다시 얻습니다.

while (condition1){
    switch (someinteger){
        case 1:
            if(!condition2);
            // other stuff here
            break;
        // other cases here
    }
}

그래서 그것은 변합니다 if(condition2) continue; 에게 if(!condition2);다른 IF 문 (중괄호 없음)에 대한 정보를 찾을 수 없었습니다. 누구든지 여기서 논리를 설명 할 수 있습니까? 미리 감사드립니다.

편집 : 더 많은 테스트를 수행했으며 디 컴파일러가 올바르게 작동하지 않습니다.

이전 코드는 다음과 같습니다.

public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException{
    int commentON=0, quoteON=0;
    int b1;
    while ((b1 = f1.read()) != -1){
        switch ((char) b1){
            case '\\':
                    if (commentON==0){
                            quoteON = 1;
                            break;
                    }
                    continue;
            case '\n':
                    if (commentON>0){ commentON=0; continue; }
                    break;
            case '%':
                    if (commentON>0) continue;
                    if (quoteON>0) { quoteON=0; break; }
                    commentON=2;
                    continue;
            default:
                    if (commentON>0) continue;
                    if (quoteON>0) quoteON=0;
                    break;
        }
        f2.write(b1);
    }
}

다음은 해독 된 코드입니다

public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException
{
int commentON = 0; int quoteON = 0;

while ((b1 = f1.read()) != -1)
{
  int b1;
  switch ((char)b1)
  {
  case '\\':
    if (commentON == 0);
    quoteON = 1;
    break;
  case '\n':
    if (commentON <= 0) break label109; commentON = 0; break;
  case '%':
    if (commentON <= 0);
    if (quoteON > 0) { quoteON = 0; break label109: }
    commentON = 2;
    break;
  }
  if (commentON <= 0);
  if (quoteON > 0) quoteON = 0;

  label109: f2.write(b1);
}
}

모두를 귀찮게해서 죄송합니다. : p 가능하다면이 질문을 삭제하려고 노력할 것입니다.

도움이 되었습니까?

해결책

디 컴파일러가 컴파일러의 코드 해석을 수행 할 때 원래 구문을 재구성하는 것은 거의 불가능합니다.

Java 컴파일러가 바이트 코드로 컴파일되는 Java 코드를 작성합니다.

그런 다음 디 컴파일러는 바이트 코드에서 Java 코드를 작성하려고 시도합니다.

두 코드 조각은 논리적으로 동일하기 때문에 디 컴파일러는 작업을 수행했습니다.

편집 (댓글보기) :

실제로, 디 컴파일러가 오류를 일으킨 것은 가능합니다 (그리고 이것은 매우 일반적입니다).

진술 if(!condition2); 본질적으로 전혀 영향을 미치지 않습니다 (제공된 조건 2는 실제로 부울이 아니며 의사 코드가 아닙니다).

그러므로 당신의 첫 번째 //other stuff here 에 관계없이 처리됩니다 condition2 코 컴파일 된 버전에서.

소환 된 코드가 올바르게 작동합니까?

다른 팁

몸이없는 if 문 ( "곱슬 괄호 없음")은 단순히 코드를 실행하지 않는 빈 IF 문입니다.

동일한 논리의 대안/표준 표현입니다. 디 컴파일러는 코드를 보존하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top