2017-05-14 1 views
0

을 존재하지 않았던 클래스에 대한 ClassNotFoundException가 점점 ADT) 앱이 처리되지 않은 ClassNotFoundException과 충돌합니다. 로그 캣은 나에게 말한다 누락 된 클래스는 존재하지 않는 클래스입니다 - 어떤추가 된 새로운 (부분적으로 리팩토링) 코드는, 지금은 내 응용 프로그램의 주요 활동에 다음 코드 한

com.myself.foo.myapp.OtherClass

입니다. 간단한 클래스 이름은 다른 패키지의 클래스 이름이지만, 접두어는 내 패키지 이름입니다. 분명히 그 수업은 결코 발견되지 않을 것입니다.

내 코드에서 OtherClass에 대한 생성자 호출을 가리키면 올바른 패키지 접두어로 올바른 클래스 이름이 표시됩니다. 소스 파일 - 각각의 경로가 그대로

두 패키지 모두 동일한 소스 트리에 존재 :

~/src/myapp/src/com/myself/foo/myapp/MainActivity.java 
~/src/myapp/src/com/someotherfellow/hisapp/OtherClass.java 

무엇이 문제의 원인, 나는이 문제를 어떻게 해결할 수 있습니까?


편집 : 그냥 호기심에서, 나는 안드로이드를 찾으려고 패키지에 OtherClass 이동 코드를 리팩토링했습니다. 지금은 얻을 :

는 java.lang.InstantiationException

: java.lang.Class의 <com.myself.foo.myapp.OtherClass>은 참으로-생성자 어느에는 제로 인수 생성자

이 없습니다 OtherClass의 3 개 인수는 호출시 제공된 3 개의 인수를 취합니다.

JVM이 어떤 알려진 생성자와도 일치하지 않는 new OtherClass() (인수가 없음)을 호출하는 것처럼 보입니다. OtherClass이 다른 패키지에 있으면 JVM은 현재 패키지에 일치하는 생성자 서명이있는 OtherClass 클래스를 찾으려고 시도합니다. 그러나 OtherClass이 같은 패키지에 있으면 JVM은 적어도 올바른 클래스를 선택하지만 일치하는 생성자를 찾지 못합니다.

JVM이 인수없는 생성자를 찾는 원인은 무엇입니까?

OtherClass은 Android 구성 요소가 아닙니다. Android 프레임 워크의 일부 클래스이며 Manifest의 아무 곳에서나 참조되지는 않습니다. OtherClassObject의 직계 종속이며 사용자 정의 Interface를 구현합니다.

+0

컴파일 오류가 발생하지 않아 컴파일 타임에 런타임에 사용할 수 없으므로 런타임에 클래스 경로를 확인할 수 있습니까 –

+0

@ gatisahu 구체적으로 어떤 설정을해야합니까? 두 패키지 모두 동일한 루트 경로 (~/src/maypp/src)를 공유한다는 점에 유의하십시오. 문제는 정규화 된 클래스 이름을 내가 가져온 패키지와 다른 패키지로 변경하고있는 것 같습니다. – user149408

답변

0

나는 오류를 발견했다고 생각합니다. 새 코드를 가져 오기 전에 앱이 작동했습니다.

내가 가져온 코드는 주요 활동에 UI와 기능이 혼합 된 앱입니다. OtherClass은 필자가 기능 만 유지 한 활동을 요약 한 것입니다.

OtherClass은 원래 내 응용 프로그램의 주요 활동과 동일한 MainActivity, 이라고합니다. Eclipse의 Refactor 기능을 사용하여 OtherClass으로 이름을 변경했습니다. 놀랍게도

, 나는 내 매니페스트에 다음을 발견

<activity 
     android:name=".OtherClass" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

은 분명히, (패키지 이름 제외) 두 개의 동일한 클래스 이름은 로컬 참조와 함께, 이클립스 혼란과 변경 매니페스트의 이름 (변경되지 않아야 함). 여기 패키지는 응용 프로그램의 기본 패키지는 매니페스트에 따라, 때문에

  • 이 원본 메시지에 대한 com.myself.foo.myapp.OtherClass되었다 : 그 이유를 설명합니다.
  • 이동 후 OtherClass을 찾은 후에도 Android는 여전히이 클래스가 Activity가 될 것으로 기대합니다. 다른 Android 시스템 구성 요소와 마찬가지로이 인수는 0 인수 생성자가 있어야합니다.

내 매니페스트의 활동 이름을 MainActivity으로 변경하면 오류가 사라집니다.

수업은 배운 : 다른 패키지에 두 개의 클래스가 Eclipse를 혼동 할 수 있습니다 그 중 하나의 이름을 변경 이러한 클래스에 대한 로컬 참조가있다 같은 단순한 이름이있을 때.

권장 사항 : 리팩터링하기 전에 모든 것을 커밋하십시오. 리팩터링 한 후 diff를보고 변경 사항이 올바른지 확인하십시오. 이렇게하면 잠재적으로 디버깅 시간을 절약 할 수 있습니다!

관련 문제