【问题标题】:NullPointer Exception when getting array size on some devices在某些设备上获取数组大小时出现 NullPointer 异常
【发布时间】:2014-11-13 11:19:30
【问题描述】:

获取数组大小时出现空指针异常。我只在某些设备上得到空指针异常。

我有一个名为ExerciseStartActivity 的课程。这里我称之为randomize方法。

public class ExerciseStartActivity extends Activity{    
     private Exercise currentExercise;  
     private FitnessExercise myExercises;
     private int exerciseNbr;
     private int maxExercises;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //..
    ....
    ....
    //

    initExercise();
}

   private void initExercise() {
    exerciseNbr = 0;
    Exercise[] exercises = loadExercises(SavingData.getDifficulty());
    myExercises = new FitnessExercise(exercises);
    myExercises.randomize();
    maxExercises = myExercises.nbrOfExercises();
    nextExercise();
}

private Exercise[] loadExercises(int difficulty) {
    Exercise[] exercise = null;
    switch(difficulty){
    case R.id.radio_easy:
        exercise = difficultyEasy();
        break;
    case R.id.radio_medium:
        exercise = difficultyMedium();
        break;
    case R.id.radio_hard:
        exercise = difficultyHard();
        break;
    }
    return exercise;
}

private Exercise[] difficultyHard() {
    Exercise[] exercises = {new Exercise("Push-ups", "pushup", 40),
            new Exercise("Leg-up Crunches", "crunch_leg_up", 90),
            new Exercise("Crunches", "crunch", 90),
            new Exercise("Bicycle Crunches", "crunch_cycle", 100),
            new Exercise("Jumping Jacks", "jumpingjack", 100),
            new Exercise("Squats", "squats", 30),
            new Exercise("High Knees", "highknees", 120),
            new Exercise("Lunges", "lunge", 30),
            new Exercise("Bench Dips", "bench_dips", 40),
            new Exercise("Knee Push-ups", "kneepushups", 80)
            };
    return exercises;
}

 }

我有一个带有 randomize 类的 FitnessExercise 类: 在这个类中,当调用 randomize() 方法时,我得到空指针异常。

public class FitnessExercise {  private Exercise[] exercises; // Array
 with all the questions
     private int index = -1; // Index of the question
     private Random random = new Random();
     public FitnessExercise(Exercise[] exercises){
        this.exercises = exercises;
     }

     public void randomize()
    {
         int swapPos;
         Exercise message;
         for (int i = exercises.length - 1; i > 0; i--)
         {
             swapPos = random.nextInt(i + 1);
             message = exercises[i];
             exercises[i] = exercises[swapPos];
             exercises[swapPos] = message;
         }
     }

 }

以下是错误:

java.lang.RuntimeException: Unable to start activity
> ComponentInfo{com.playsimple.fitnessapp/com.playsimple.fitnessapp.ExerciseStartActivity}:
> java.lang.NullPointerException at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
> at
> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
> at android.app.ActivityThread.access$800(ActivityThread.java:135) at
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
> at android.os.Handler.dispatchMessage(Handler.java:102) at
> android.os.Looper.loop(Looper.java:136) at
> android.app.ActivityThread.main(ActivityThread.java:5001) at
> java.lang.reflect.Method.invokeNative(Native Method) at
> java.lang.reflect.Method.invoke(Method.java:515) at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at
> dalvik.system.NativeStart.main(Native Method) Caused by:
> java.lang.NullPointerException at
> com.playsimple.fitnessapp.FitnessExercise.randomize(FitnessExercise.java:34)
> at
> com.playsimple.fitnessapp.ExerciseStartActivity.initExercise(ExerciseStartActivity.java:74)
> at
> com.playsimple.fitnessapp.ExerciseStartActivity.onCreate(ExerciseStartActivity.java:67)
> at android.app.Activity.performCreate(Activity.java:5231) at
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
> at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
> ... 11 more

【问题讨论】:

  • 你考虑过loadExercises可能返回null的可能性吗?
  • 我现在已经添加了 loadExercises()。但是为什么它只在某些情况下返回 null 呢?

标签: java android arrays nullpointerexception


【解决方案1】:

加载后你的练习是null

Exercise[] exercises = loadExercises(SavingData.getDifficulty());
if (exercises == null) {
    // no exercises were loaded
    // maybe create default exercises here?

} else {
    myExercises = new FitnessExercise(exercises);
    myExercises.randomize();
    maxExercises = myExercises.nbrOfExercises();
    nextExercise();
}

【讨论】:

    【解决方案2】:

    这个问题很容易理解。只需阅读堆栈跟踪:

    Caused by: java.lang.NullPointerException at
        com.playsimple.fitnessapp.FitnessExercise.randomize(FitnessExercise.java:34) at 
        ....
    

    您正在尝试访问实际上是null 的实例。我不知道第 34 行是什么,但可能的候选人是:

    // You do not check if "exercices" is not null
    for (int i = exercises.length - 1; i > 0; i--)
    

    也许这一行在initExercise() 中返回null

    loadExercises(SavingData.getDifficulty());
    

    【讨论】:

    • 我现在添加了上面的 loadExercises() 检查。但是为什么 loadExercises() 方法只在某些情况下返回 null 呢?
    • 可能有时您会通过正确的“难度”。所以你的开关什么也不做,返回值保持为空。
    • 我检查了我的代码,但找不到返回 null 的原因。它在大多数设备中都能完美运行。它在某些设备上崩溃,因为我有崩溃报告。
    • 你不处理难度不是R.id.radio_easyR.id.radio_mediumR.id.radio_hard的情况
    • 我已经处理了这个案子。像这样:默认:练习=难度Easy();休息;
    【解决方案3】:

    您的问题可能在于这 3 行:

    Exercise[] exercises = loadExercises(SavingData.getDifficulty()); // may return null
    myExercises = new FitnessExercise(exercises); // the null is passed to this instance
    myExercises.randomize(); // the null is referenced here
    

    你没有包含loadExercises的代码,但是根据你得到的异常,这个方法很可能在某些情况下返回null。此 null 用于初始化FitnessExercise 实例,并导致randomize() 中的NullPointerException

    我建议不要返回 null,而是在 loadExercises 中返回一个空数组。

    【讨论】:

    • 我现在添加了上面的 loadExercises() 检查。但是为什么 loadExercises() 方法只在某些情况下返回 null 呢?
    • @user3730218 如果传递的difficulty 与您的switch 语句中的任何情况都不匹配,会发生什么情况?建议你把第一行改成Exercise[] exercise = new Exercise[0];
    • 我可以在开关盒中添加这个吗?默认值:练习 = 难度容易();休息; }
    • @user3730218 是的,假设difficultyEasy() 不返回空值,这将起作用。
    • 尽管我在 switch 案例中添加了默认语句,但我仍然得到错误。
    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    相关资源
    最近更新 更多