Android字符串阵列崩溃

时间:2011-08-10 06:23:50

标签: java android nullpointerexception arrays runtimeexception

我的Android应用程序有一个非常奇怪的问题。每次我将string-array添加到strings.xml(或res / values /中的任何其他文件)时,我的程序在启动时崩溃。我绝对肯定地知道,这就是它崩溃的原因(因为每当我删除它,它都可以正常工作)。无论如何,这是导致崩溃的XML代码:

<string-array name="main_list">
        <item>Collections</item>
        <item>Requests</item>
        <item>Forums</item>
</string-array>

它的格式是否有问题?它位于“资源”标签和一切内部。这是完整的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Activity Names -->
    <string name="app_name">MyFavs</string>
    <!-- Login Vars -->
    <string name="username_login_field">Username</string>
    <string name="password_login_field">Password</string>
    <string name="login_btn">Login!</string>
    <string name="remember_login_tag">Save Login Info</string>
    <string name="no_username_password">You must supply a username and password</string>
    <string name="sign_in_cancelled">Sign-in cancelled</string>
    <string name="sign_in_progress">Signing in...</string>
    <string name="invalid_username_password_alert_title">Error</string>
    <string name="invalid_username_password_alert_btn">Ok</string>
    <string name="menu_forgotten_password">Forgot Password?</string>
    <!-- ForgotPasswd Vars -->
    <string name="forgotten_pass_field">Email</string>
    <string name="forgotten_pass_btn">Recover Account</string>
    <string name="forgot_passwd_progress">Recovering account...</string>
    <string name="invalid_forgot_passwd_title">Recover Account</string>
    <string name="invalid_forgot_passwd_btn">Ok</string>
    <string name="no_email">You must supply a valid email</string>
    <string name="recover_cancelled">Recover cancelled</string>
    <string name="menu_home">Home</string>
    <string-array name="main_list">
        <item>Collections</item>
        <item>Requests</item>
        <item>Forums</item>
    </string-array>
</resources>

同样,删除底部的“字符串数组”部分会使程序正常工作,但添加它会导致崩溃。

这是logcat崩溃日志(虽然没有多大帮助):

W/dalvikvm(  849): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime(  849): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime(  849): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.myfavs.droid/org.myfavs.droid.login}: java.lang.NullPointerException
E/AndroidRuntime(  849):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
E/AndroidRuntime(  849):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
E/AndroidRuntime(  849):        at android.app.ActivityThread.access$2200(ActivityThread.java:119)
E/AndroidRuntime(  849):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
E/AndroidRuntime(  849):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  849):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  849):        at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime(  849):        at java.lang.reflect.Method.invokeNative(NativeMethod)
E/AndroidRuntime(  849):        at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  849):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime(  849):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime(  849):        at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(  849): Caused by: java.lang.NullPointerException
E/AndroidRuntime(  849):        at org.myfavs.droid.login.onCreate(login.java:32)
E/AndroidRuntime(  849):        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(  849):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
E/AndroidRuntime(  849):        ... 11 more
I/Process (   51): Sending signal. PID: 849 SIG: 3

如果有任何想法,请分享。我一直在研究这个问题很长一段时间,我确信这是一个愚蠢的错误,但我只需要另外一双眼睛。我愿意尝试任何可能的解决方案。

编辑:

我删除了对字符串数组资源的每个引用,只是包含资源导致崩溃。我没有在任何地方引用它,所以它不会引起问题。

根据要求,这是我的onCreate for“login”,虽然我很长时间没有触及该代码并且它始终有效:

public void onCreate(Bundle savedInstanceState)
    {
    Log.d("Login","onCreate called");
        super.onCreate(savedInstanceState);
    Interactor.create(this);
        setContentView(R.layout.login);
    ((EditText)findViewById(R.id.username)).setText(Interactor.getDB().getSetting("username"));
        EditText pwd = (EditText)findViewById(R.id.password);
    pwd.setText(Interactor.getDB().getSetting("password"));
    if (Interactor.getDB().getSetting("save_login").equals("yes"))
        ((CheckBox)findViewById(R.id.remember_login)).setChecked(true);
        // Treat "Send" soft-button on keyboard as a button click
        pwd.setOnEditorActionListener(new android.widget.TextView.OnEditorActionListener()
                {
                    public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
                    {
                        if (actionId == EditorInfo.IME_ACTION_SEND)
                            ((Button)findViewById(R.id.login_btn)).performClick();
                        return true;
                    }
                });
    }

只是通过将资源包含在res / values中来引发异常,即使没有引用它也是如此。这就是为什么它对我这么奇怪......

编辑编辑:

Jon Skeet可能会有所作为。在包含字符串数组资源的同时,注释掉登录的onCreate的第32行(正如我在上面的注释中所说的那样),应用程序再次工作。所以添加一个字符串数组会以某种方式打破这一行?任何有关为什么添加字符串数组资源的帮助都会破坏它,但它在没有添加资源的情况下100%工作?

3 个答案:

答案 0 :(得分:1)

你的字符串数组肯定没有问题。问题在你访问字符串的代码中

试试这个

Resources res = getResources();
String[] list = res.getStringArray(R.array.main_list);

答案 1 :(得分:1)

嗯,这是一篇5年的帖子,但我遇到了完全相同的问题(Android Studio 2.1.3)。对我来说,第一个字符串数组工作得很好,但每当我尝试在同一个文件中添加第二个字符串(strings.xml)时,我的应用程序崩溃了。所以我正在进行测试,我注意到如果你对String资源进行了更改,那么更改会立即显示在设计上,但是如果你运行应用程序,它就会保持不变。我认为它与缓存有关,所以我只是关闭并打开ANDDROID STUDIO,并且让我感到惊讶,至少对我来说,它是干嘛工作的。如果你想要比关闭更快的东西并手动打开它,这是最好的解决方案:在你的项目中点击文件 - &gt;使缓存/重新启动无效 - >重新启动并完成。

的Pd。当我发现这个问题时,我正在使用Spinners,这是我的一些代码:

“的strings.xml”:

<resources>
   <string name="app_name">Mascota Mia</string>
   <string name="registrar_mascota">Registrar Mascota</string>
   <string name="agendar_consulta">Agendar Consulta</string>
   <string-array name="raza_array">
      <item>Perro</item>
      <item>Gato</item>
      <item>Cocodrilo</item>
      <item>Armadillo</item>
      <item>Ganso</item>
   </string-array>
   <string-array name="pasatiempo_array">
      <item>Correr</item>
      <item>Nadar</item>
      <item>Dormir</item>
      <item>Morder el hueso</item>
      <item>Perseguir al gato</item>
   </string-array>
</resources>

“RegistrarMascota.java”(只有onCreate方法,这是我在Spinners中使用字符串数组的地方):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_registrar_mascota);


   //Spinner para la raza
    Spinner spinneRaza = (Spinner) findViewById(R.id.raza);
    ArrayAdapter<CharSequence>adapteRaz = ArrayAdapter.createFromResource(this,
            R.array.raza_array, android.R.layout.simple_spinner_item);
    adapteRaz.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinneRaza.setAdapter(adapteRaz);
    spinneRaza.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

            Toast.makeText(getBaseContext(), parent.getItemAtPosition(pos)+" seleccionado", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }

    });


    //Spinner para los pasatiempos
    Spinner spinnerPas = (Spinner) findViewById(R.id.pasatiempo);
    ArrayAdapter<CharSequence> adapterPas = ArrayAdapter.createFromResource(this,
            R.array.pasatiempo_array, android.R.layout.simple_spinner_item);
    adapterPas.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerPas.setAdapter(adapterPas);
    spinnerPas.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

            Toast.makeText(getBaseContext(), parent.getItemAtPosition(pos)+" seleccionado", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }

    });

}

答案 2 :(得分:0)

我遇到了同样的问题,这是一个糟糕的备份。只需清除应用程序的数据即可(卸载将无效)