簡體   English   中英

JPE:嘗試在空對象引用上調用虛擬方法“android.content.res.Resources”

[英]JPE: Attempt to invoke virtual method 'android.content.res.Resources' on a null object reference

好吧好吧,我已經閱讀了這些不同的帖子: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' and this What is a NullPointerException, and how我要修嗎? 而這個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"))
    );
 }
}

這是我的 Fragment 的代碼:

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"))
    );

修改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());
}

注意:此答案僅適用於顯示的錯誤。 如果錯誤被清除,即使另一個錯誤出現並仍然存在(應作為另一個問題發布),也應關閉此問答。

您不能將任何類擴展到AppCompatActivity
我假設您的SMS對象不是Activity 我認為你只是這樣做了,所以它在你的類中公開了getResources()方法,但這不是它的工作原理。

您需要一種方法來訪問您想要執行getResources()任何地方的Context對象,然后在該對象上調用它。 @hata 的回答給出了一個如何做到這一點的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM