JPE:尝试在空对象引用上调用虚拟方法“android.content.res.Resources”

Posted

技术标签:

【中文标题】JPE:尝试在空对象引用上调用虚拟方法“android.content.res.Resources”【英文标题】:JPE: Attempt to invoke virtual method 'android.content.res.Resources' on a null object reference 【发布时间】:2021-12-16 23:36:24 【问题描述】:

好吧好吧好吧, 我已经阅读了这些不同的帖子:java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' 和这个 What is a NullPointerException, and how do I fix it? 和这个java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources() 已经尝试了很多东西。但我的问题还是一样。 也许我错过了什么,我是新人,我正在尽力而为,请善待。

我在片段“DataSetFragment1”中调用了我的 SMS 类的方法

谁能帮帮我,提前谢谢

这是我的 SMS 类的代码:

public class Sms extends AppCompatActivity 
    private String contact;
    private String content;
    private int type;
    private int read;
    private String date;

 public void addSMS()
 
    List<Sms> mesSms= new ArrayList<>();
    InputStream is = getResources().openRawResource(R.raw.sms1);
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(is, Charset.forName("UTF-8"))
    );
 

这是我的片段的代码:

public class Dataset1Fragment extends Fragment 
 private void createOnClicBtnEnreg()
        Sms mesSms = new Sms();
        mesSms.addSMS();

 @Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) 
    super.onViewCreated(view, savedInstanceState);
    view.findViewById(R.id.btnEnreg).setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            btnEnreg = view.findViewById(R.id.btnEnreg);

            Context myContext = getContext();
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) 
                RoleManager roleManager = myContext.getSystemService(RoleManager.class);
                // check if the app is having permission to be as default SMS app
                assert roleManager != null;
                boolean isRoleAvailable = roleManager.isRoleAvailable(RoleManager.ROLE_SMS);
                if (isRoleAvailable)
                    // check whether your app is already holding the default SMS app role.
                    boolean isRoleHeld = roleManager.isRoleHeld(RoleManager.ROLE_SMS);
                    if (!isRoleHeld)
                        Intent roleRequestIntent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS);
                        startActivityForResult(roleRequestIntent,5);
                    
                
             else 
                Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
                intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, myContext.getPackageName());
                startActivityForResult(intent, 5);
            

            if (hasPermissions(getContext(),Permissions))
                createOnClicBtnEnreg();
                Toast.makeText(getContext(), "Insertion OK", Toast.LENGTH_SHORT).show();

            
 

这是我的日志:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.data.myApp, PID: 12080
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
    at android.content.ContextWrapper.getResources(ContextWrapper.java:93)
    at android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:134)
    at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:128)
    at androidx.appcompat.app.AppCompatActivity.getResources(AppCompatActivity.java:566)
    at com.example.testbackup.Sms.addSMS(Sms.java:36)
    at com.example.testbackup.ui.dataset1.Dataset1Fragment.createOnClicBtnEnreg(Dataset1Fragment.java:321)
    at com.example.testbackup.ui.dataset1.Dataset1Fragment.access$100(Dataset1Fragment.java:61)
    at com.example.testbackup.ui.dataset1.Dataset1Fragment$2.onClick(Dataset1Fragment.java:251)

编辑: 这段代码很好,遵循了 Hata 和 Ivo Beckers 的响应

public class Sms
private String contact;
private String contenu;
private int type;
private int read;
private String date;


public void addSMS(Context myContext)

    List<Sms> mesSms= new ArrayList<>();
    InputStream is = myContext.getResources().openRawResource(R.raw.sms1);
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(is, Charset.forName("UTF-8"))
    );

【问题讨论】:

【参考方案1】:

修改addSMS如下:

public void addSMS(Context context) 
    List<Sms> mesSms= new ArrayList<>();
    InputStream is = context.getResources().openRawResource(R.raw.sms1);
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(is, Charset.forName("UTF-8"))
    );

并在您使用时从 createOnClicBtnEnreg 传递 Context 实例:

private void createOnClicBtnEnreg()
    Sms mesSms = new Sms();
    mesSms.addSMS(getContext());

注意:此答案仅针对显示的错误。如果错误被清除,即使出现另一个错误并仍然存在(应该作为另一个问题发布),也应该关闭此问答。

【讨论】:

仍然返回同样的错误java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference @LouisChabert 这是另一个错误【参考方案2】:

您不能将任何类扩展到AppCompatActivity。 我假设您的SMS 对象不是Activity。我认为您只是这样做了,因此它在您的课程中公开了 getResources() 方法,但这不是它的工作原理。

您需要一种方法来访问Context 对象,无论您想做什么getResources(),然后在该对象上调用它。 @hata 的回答举了一个例子说明如何做到这一点

【讨论】:

那是我的问题!!!谢谢 !我将编辑我的课程! 很好的解释:)

以上是关于JPE:尝试在空对象引用上调用虚拟方法“android.content.res.Resources”的主要内容,如果未能解决你的问题,请参考以下文章

NullPointerException:尝试在空对象引用上调用虚拟方法 findViewById(int)'

致命异常: main ,尝试在空对象引用上调用虚拟方法 [重复]

尝试在空对象引用上调用虚拟方法 com.google.firebase.iid.FirebaseInstanceId.getInstanceId()'

NullPointerException 错误尝试在空对象引用上调用虚拟方法错误

Android错误尝试在空对象引用上调用虚拟方法[重复]

AsyncTask +数据库尝试在空对象引用上调用虚拟方法[重复]