【问题标题】:Null pointer exception android array空指针异常android数组
【发布时间】:2017-01-30 11:55:42
【问题描述】:

我正在制作一个具有 2 个 java 类的应用程序:MainActivitySecondActivityMainActivity 使用onClick 方法启动SecondActivity

SecondActivity 有 2 个数组存储在 strings.xml 文件中。 SecondActivity 类希望将所有数组变量从 strings.xml 存储到自身,以便将其用于某些方法。我认为我做错了,因为我尝试将数组直接存储在 SecondActivity 中并且它有效,但是当我将数组存储在 strings.xml 中时,它给出了 NullPointerException

这里是SecondActivity 代码:

package com.android.ict.seneca.androidpocketguide;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class SecondActivity extends Activity {

    private final String CLASS_NAME = "SecondActivity";

    String [] Vocabularies = getResources().getStringArray(R.array.Vocabularies_array);
    String [] meanings = getResources().getStringArray(R.array.meanings_array);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this,
                android.R.layout.simple_dropdown_item_1line, Vocabularies);

        //ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, meanings);

        AutoCompleteTextView textView =
                (AutoCompleteTextView) findViewById(R.id.vocabularies);

        textView.setThreshold(2); // minimum number of characters to be typed

        textView.setAdapter(adapter); // connect the list of suggestions to the View object

    }

    public void onStart(){
        super.onStart();
        Log.d( CLASS_NAME, "onStart invoked!" );
    }

    public void onPause(){
        super.onPause();
        Log.d( CLASS_NAME, "onPause invoked!!" );
    }

    public void onResume(){
        super.onResume();
        Log.d( CLASS_NAME, "onResume invoked!!" );
    }

    public void onStop(){
        super.onStop();
        Log.d( CLASS_NAME, "onStop invoked!!!" );
    }

    public void onDestroy(){
        super.onDestroy();
        Log.d( CLASS_NAME, "onDestroy INVOKED!!!" );
    }

    public void onRestart(){
        super.onRestart();
        Log.d( CLASS_NAME, "onRestart invoked!!" );
    }

    // event handler for the button
    public void onClick(View view) {


        Intent data = new Intent();

        EditText usr =
                (EditText) findViewById(R.id.vocabularies); // get user input

        // set the data part (an URI reference) of an intent
        data.setData(Uri.parse(usr.getText().toString()));
        String s = data.getData().toString();

        int flag = 0;

        for(int i=0; i<Vocabularies.length;i++)
        {
            if(s.equals(Vocabularies[i]))
            {
                flag = i;
            }
        }

        Toast.makeText(this, "YOU'VE ENTERED: " + s, Toast.LENGTH_LONG ).show();

        String m = meanings[flag];
        String disp = "Vocabulary: " + s + "\n" + "Meaning: " + m;

        TextView textViewObj1 = (TextView) findViewById(R.id.meaning);
        textViewObj1.setText(disp);

        //finish();   //--- close the activity AND RETURN CONTROL TO THE REQUESTING ACTIVITY


        //EditText txt_username = (EditText) findViewById(R.id.txt_username);
    } // end onClick
}

这里是MainActivity 代码:

package com.android.ict.seneca.androidpocketguide;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private final String CLASS_NAME = "FirstActiviy";
    private int request_Code = 1;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d( CLASS_NAME, "onCreate invoked!" );
    }

    public void onStart(){
        super.onStart();
        Log.d( CLASS_NAME, "onStart invoked!" );
    }

    public void onPause(){
        super.onPause();
        Log.d( CLASS_NAME, "onPause invoked!!" );
    }

    public void onResume(){
        super.onResume();
        Log.d( CLASS_NAME, "onResume invoked!!" );
    }

    public void onStop(){
        super.onStop();
        Log.d( CLASS_NAME, "onStop invoked!!!" );
    }

    public void onDestroy(){
        super.onDestroy();
        Log.d( CLASS_NAME, "onDestroy INVOKED!!!" );
    }

    public void onRestart(){
        super.onRestart();
        Log.d( CLASS_NAME, "onRestart invoked!!" );
    }


    // event handler for the button (activity 2)
    public void onClick(View view) {

        startActivityForResult( new Intent(
                        "com.android.ict.seneca.androidpocketguide.second"), // declared  by an intent filter
                request_Code);   // (requesting) activity ID

        Log.d( CLASS_NAME, "after startActivityForResult" );
//intent.setData(Uri.parse("com.seneca.lab2b.abbas"));
        //startActivity(intent);
    }

    /*
    public void onActivityResult( int requestCode,   // used to match the REQUESTING activity ID
                                  int resultCode,    // result code set by the sender (i.e. the TARGET activity)
                                  Intent data )      // an intent passed by the sender (i.e. the TARGET activity)
    {
        if (requestCode == request_Code) {
            if (resultCode == RESULT_OK) {


                //TextToSpeech(data.getData().toString());

                Intent intent = getIntent();

                String s = data.getData().toString();

                TextView textViewObj1 = (TextView) findViewById(R.id.line);
                textViewObj1.setText(s);


                Toast.makeText(
                        this,
                        "MESSAGE RECEIVED: " + s,  // retrieve data from the intent
                        // API Question: What is the  return type of getData()?
                        Toast.LENGTH_LONG ).show();
            }
        }
        Log.d( CLASS_NAME, "onActivityResult: what is next?" );
    }


    // event handler for a button (activity 3)
    public void onClick3(View view) {

        Intent dataIntent = new Intent( this, ThirdActivity.class );//"com.seneca.lab2b.third"); // explicit intent

        // the putExtra( ) method
        dataIntent.putExtra( "greeting", "Good morning  Android!" );
        dataIntent.putExtra( "number", 123 );

        // create a Bundle object
        Bundle bundle = new Bundle();
        bundle.putString( "My name", "Abbas Zoeb" );
        bundle.putInt( "Student ID", 56789  );

        // putExtras( ): store the bundle in the intent
        dataIntent.putExtras( bundle );

        // launch the third activity
        startActivity( dataIntent );

        //startActivity( new Intent( this, ThirdActivity.class ) );

    }
    */

}

这是错误日志:

09-21 23:43:19.907 26183-26183/com.android.ict.seneca.androidpocketguide E/AndroidRuntime: 致命异常: main 进程:com.android.ict.seneca.androidpocketguide,PID:26183 java.lang.RuntimeException:无法实例化活动 ComponentInfo{com.android.ict.seneca.androidpocketguide/com.android.ict.seneca.androidpocketguide.SecondActivity}:java.lang.NullPointerException:尝试调用虚拟方法 'android.content .res.Resources android.content.Context.getResources()' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.content.res.Resources android.content.Context.getResources()' 在 android.content.ContextWrapper.getResources(ContextWrapper.java:87) 在 android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:81) 在 com.android.ict.seneca.androidpocketguide.SecondActivity.(SecondActivity.java:22) 在 java.lang.Class.newInstance(本机方法) 在 android.app.Instrumentation.newActivity(Instrumentation.java:1067) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

这里是 string.xml 文件:

<resources>
    <string name="app_name">Android Pocket Guide</string>
    <string-array name="Vocabularies_array">
        <item>activity</item>
        <item>AVD</item>
        <item>ART</item>
        <item>Dalvik</item>
        <item>intent</item>
        <item>intent filter</item>
        <item>explicit intent</item>
        <item>implicit intent</item>
        <item>LogCat</item>
        <item>bundle</item>
        <item>Gradle</item>
        <item>Android Device Monitor</item>
        <item>SDK manager</item>
        <item>minSdkVersion</item>
    </string-array>

    <string-array name="meanings_array">
        <item>An activity represents a single screen with a user interface just like window or frame of Java</item>
        <item>An Android Virtual Device (AVD) is an emulator configuration that lets you model an actual device by defining hardware and software options to be emulated by the Android Emulator.</item>
        <item>Android Runtime (ART) is an application runtime environment used by the Android operating system.</item>
        <item>Dalvik is a part of the software stack that makes up the Android platform.</item>
        <item>Intent can be defined as a simple message objects which is used to communicate from 1 activity to another.</item>
        <item>Specifies the types of intents that an activity, service, or broadcast receiver can respond to</item>
        <item>An explicit intent is one that you use to launch a specific app component, such as a particular activity or service in your app</item>
        <item>Implicit intents do not name a specific component, but instead declare a general action to perform, which allows a component from another app to handle it.</item>
        <item>Logcat is a command-line tool that dumps a log of system messages, including stack traces when the device throws an error and messages that you have written from your app with the Log class.</item>
        <item>A Bundle is a set of key/value pairs, where it implements an interface called Parcelable.</item>
        <item>Gradle is a custom build tool used to build android packages (apk files) by managing dependencies and providing custom build logic.</item>
        <item>Android Device Monitor is a standalone tool that provides a UI for several Android application debugging and analysis tools.</item>
        <item>A software development kit that enables developers to create applications for the Android platform.</item>
        <item>An integer designating the minimum API Level required for the application to run.</item>
    </string-array>


</resources>

【问题讨论】:

  • 无法找到您使用 getResources() 的上下文。 String [] Vocabularies = getResources().getStringArray(R.array.Vocabularies_array);字符串 [] 含义 = getResources().getStringArray(R.array.meanings_array);在 oncreate 下初始化这部分只需全局声明即可。 AS 上下文未初始化
  • 这些答案肯定有帮助,我的错误已修复。非常感谢男孩/女孩:)

标签: java android nullpointerexception


【解决方案1】:

试试这个方法

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Vocabularies = getResources().getStringArray(R.array.Vocabularies_array);
        meanings = getResources().getStringArray(R.array.meanings_array);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this,
                android.R.layout.simple_dropdown_item_1line, Vocabularies);

        //ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, meanings);

        AutoCompleteTextView textView =
                (AutoCompleteTextView) findViewById(R.id.vocabularies);

        textView.setThreshold(2); // minimum number of characters to be typed

        textView.setAdapter(adapter); // connect the list of suggestions to the View object

    }

【讨论】:

  • 这些答案肯定有帮助,我的错误已修复。非常感谢男孩/女孩:)
【解决方案2】:

尝试在全局上下文中声明您的数组,然后在活动的生命周期阶段之一(即 onCreate()、onResume() 等)为它们分配一些值。

您遇到的问题是getResources()。我会创建一个Context 类型的全局变量。然后,我会在onCreate() 中做的是:

context = this;
vocabularies = context.getResources().getStringArray(R.array.Vocabularies_array);
meanings = context.getResources().getStringArray(R.array.meanings_array);

希望有帮助!

【讨论】:

  • 这些答案肯定有帮助,我的错误已修复。非常感谢男孩/女孩:)
【解决方案3】:

这些变量初始化...

String [] Vocabularies = getResources().getStringArray(R.array.Vocabularies_array);
String [] meanings = getResources().getStringArray(R.array.meanings_array);

...可能需要进入构造函数,或者更可能进入onCreate(...),特别是在

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

【讨论】:

    【解决方案4】:

    在 oncreate/onPostcreated 等方法中初始化变量,例如

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Vocabularies = getResources().getStringArray(R.array.Vocabularies_array);
        meanings = getResources().getStringArray(R.array.meanings_array);
    
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this,
                android.R.layout.simple_dropdown_item_1line, Vocabularies);
    
        //ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, meanings);
    
        AutoCompleteTextView textView =
                (AutoCompleteTextView) findViewById(R.id.vocabularies);
    
        textView.setThreshold(2); // minimum number of characters to be typed
    
        textView.setAdapter(adapter); // connect the list of suggestions to the View object
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多