Pemula. Hari ini saya menulis kod untuk melompat antara aktiviti, menggunakan niat eksplisit, tetapi saya mentakrifkan pembolehubah ahli niat dalam kelas, dan apabila saya menggunakannya dalam kaedah, program itu ranap Mengapa ini?
public class MusicPlay extends Activity{
//下面这一句初始化出了错误
public Intent intent=intent=new Intent(this,MusicServer.class);
....
Kod adalah seperti di atas, tetapi mesej ralat ialah:
Disebabkan oleh: java.lang.NullPointerException: Percubaan untuk menggunakan kaedah maya 'java.lang.String android.content.Context.getPackageName()' pada rujukan objek nol
Dikatakan bahawa ralat berlaku semasa memanggil kaedah maya getPackageName() pada "rujukan objek nol".
Pada mulanya, saya fikir ini kosong dan menyebabkan masalah, jadi saya mengubah suai kod:
public class MusicPlay extends Activity{
Intent intent;
public MusicPlay(){
super();
if(this!=null){
intent=new Intent(this,MusicServer.class);
}
}
....
Tetapi ralat masih berlaku dan mesej ralat masih sama. Melalui penghakiman bersyarat, saya tahu bahawa ini tidak kosong, jadi mengapa ia masih dikatakan sebagai rujukan batal?
Activity
是ContextWrapper
的子类, 所以我们先找到并打开ContextWrapper.java
源码, 关键代码如下:ContextWrapper
里基于Context
的调用都是直接使用mBase
来间接实现调用的. 那么这个mBase
是什么时候被赋值的呢? 找到并打开ActivityThread.java
, 就能找到它被赋值的代码部分, 关键代码如下:以上, 可知: 实例化
Activity
时,ContextWrapper#getBaseContext()
返回的是null, 因此, 不能在构造函数或者构造成员变量时直接调用与Context
ContextWrapper
, jadi kami mula-mula mencari dan membuka kod sumberContextWrapper.java
Kod utama adalah seperti berikut: 🎜 rrreee 🎜ContextWrapper
panggilan berdasarkanContext
terus menggunakanmBase
untuk melaksanakan panggilan secara tidak langsung KemudianmBase
ini ialah Bilakah ia ditugaskan? Cari dan bukaActivityThread.java
, dan anda boleh mencari bahagian kod di mana ia ditetapkan Kod kunci adalah seperti berikut: 🎜 rrreee 🎜Daripada perkara di atas, dapat dilihat bahawa: apabila menginstantAktiviti
,ContextWrapper#getBaseContext()
mengembalikan nol Oleh itu, ia tidak boleh dipanggil secara langsung dalam pembina atau semasa membina pembolehubah ahli denganKelas anda mewarisi kelas Aktiviti, kemudian ia mempunyai kitaran hayat, dan semua logik dijalankan dalam kitaran hayat ini, dengan kata lain, kod logik anda mesti ditulis dalam kaedah kitaran hayat tersebut onCreate kaedah dan tulis lompat halaman di sana Penamaan pengecam kaedah anda juga tidak diseragamkan
Anda perlu mengatasi kaedah onCreate()