초보자. 오늘은 명시적 인텐트를 사용하여 활동 간을 이동하는 코드를 작성했지만 클래스에 인텐트 멤버 변수를 정의했는데 이를 메서드에서 사용하면 프로그램이 충돌하는 이유는 무엇입니까?
으아악코드는 위와 같으나 오류 메시지는 다음과 같습니다.
원인: java.lang.NullPointerException: null 개체 참조에서 가상 메서드 'java.lang.String android.content.Context.getPackageName()' 호출 시도
"null 개체 참조"에서 getPackageName() 가상 메서드를 호출할 때 오류가 발생했다고 합니다.
처음에는 이것이 비어 있어서 문제가 발생한다고 생각하여 코드를 수정했습니다.
으아악하지만 여전히 오류가 발생하고 오류 메시지도 동일합니다. 조건부 판단을 통해 이것이 비어 있지 않다는 것을 알고 있는데 왜 여전히 널 참조라고 하는 걸까요?
Activity
是ContextWrapper
的子类, 所以我们先找到并打开ContextWrapper.java
源码, 关键代码如下:ContextWrapper
里基于Context
的调用都是直接使用mBase
来间接实现调用的. 那么这个mBase
是什么时候被赋值的呢? 找到并打开ActivityThread.java
, 就能找到它被赋值的代码部分, 关键代码如下:以上, 可知: 实例化
Activity
时,ContextWrapper#getBaseContext()
返回的是null, 因此, 不能在构造函数或者构造成员变量时直接调用与Context
Activity
는ContextWrapper
의 하위 클래스이므로 먼저ContextWrapper.java
소스 코드를 찾아서 엽니다. 🎜 으아아아Context
를 기반으로 하는 🎜ContextWrapper
호출은mBase
를 직접 사용하여 호출을 간접적으로 구현합니다. 그러면 이mBase
는 언제였습니까? 할당되었나요?ActivityThread.java
를 찾아 열면 할당된 코드 부분을 찾을 수 있습니다. 🎜 으아아아 🎜위에서 알 수 있듯이Activity
를 인스턴스화할 때ContextWrapper#getBaseContext()
는 null을 반환하므로 생성자에서Context와 관련된 모든 함수 및 클래스의 인스턴스화
. 필요한 경우 라이프 사이클 함수에서 호출하세요.🎜클래스는 Activity 클래스를 상속하고 라이프 사이클을 가지며 모든 로직은 이러한 라이프 사이클에서 수행됩니다. 즉, 로직 코드는 해당 라이프 사이클의 메서드로 작성되어야 합니다. onCreate 메소드를 작성하고 거기에 페이지 점프를 작성하면 메소드의 식별자 이름도 표준화되지 않습니다
onCreate() 메서드를 재정의해야 합니다