簡體   English   中英

[新手][Java] Object 不知何故是 null

[英][Novice][Java] Object is null somehow

我做了一個小程序來生成隨機音符。 我收到以下錯誤:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.ArrayList.add(Object)" because ".llaveFa" is null at sollasidore_14_9.main(sollasidore_14_9.java:99)

我在第 71 行使用了 new ,所以我不明白。

代碼是:

import java.util.concurrent.ThreadLocalRandom;
import java.lang.Integer;
import java.util.ArrayList;

class Nota {
    /*
     * private final static int[] notas = {
        1, //C3=1,
        2, //D3=2,
        3, //E3=3,
        4, //F3=4,
        5, //G3=5,
        6, //A3=6,
        7, //B3=7,
        8, //C4=8,
        9, //D4=9,
        10,// E4=10,
        11,// F4=11,
        12,// G4=12,
        13,// A4=13,
        14,// B4=14,
        15,// C5=15,
        16,// D5=16,
        17,// E5=17,
        18,// F5=18,
        19,// G5=19,
        20,// A5=20,
        21// B5=21;
    };
    */

    int C3,D3,E3,F3,G3,A3,B3,C4,D4,E4,F4,G4,A4,B4,C5,D5,E5,F5,G5,A5,B5;

    ArrayList<Integer> llaveSol, llaveFa;
}

class NotaStr {
    final static String[] notas = {
        "C3",
        "D3",
        "E3",
        "F3",
        "G3",
        "A3",
        "B3",
        "C4",
        "D4",
        "E4",
        "F4",
        "G4",
        "A4",
        "B4",
        "C5",
        "D5",
        "E5",
        "F5",
        "G5",
        "A5",
        "B5"
    };
}                                       

//  sollasidore <iteraciones> <repetición>
//               int            boolean: 1 con, 0 sin.
//               14 notas llave de sol
//               9 notas llave de fa
public class sollasidore_14_9
{
    public static void main(String[] args)
    {
        Nota      llaveObj = new Nota();


        int randomNum=0;
        int randomNumPrev=0;
        int count=0;

        // valores entrada
        //int repeticion = Integer.parseInt(args[1]);
        //int iter = Integer.parseInt(args[0]);

        int repeticion = 0;
        int iter = 150;

        //LLave de Fa
        for(;count<iter ;count++) {
            //Returns a pseudorandom int value between the specified 
            //origin (inclusive) and the specified bound (exclusive).
            //nextInt(int origin, int bound)
            // nextInt is normally exclusive of the top value,
            // so add 1 to make it inclusive
            randomNum = ThreadLocalRandom.current().nextInt(1, 6 + 1);
            
            if(!(repeticion==1)) {
                while ((randomNum == randomNumPrev) )
                    randomNum = ThreadLocalRandom.current().nextInt(1, 6 + 1);
            }

            llaveObj.llaveFa.add(randomNum);

            switch (randomNum) {
            case 1: 
                        llaveObj.C3++;
                  break;
            case 2: 
                        llaveObj.D3++;
                  break;
            case 3: 
                        llaveObj.E3++;
                  break;
            case 4: 
                        llaveObj.F3++;
                  break;
            case 5: 
                        llaveObj.G3++;
                  break;
            case 6: 
                        llaveObj.A3++;
                  break;
            case 7: 
                        llaveObj.B3++;
                  break;
            }
            
            randomNumPrev=randomNum;
        }

        //LLave de Sol
        for(count = 0;count<iter ;count++) {
            //Returns a pseudorandom int value between the specified 
            //origin (inclusive) and the specified bound (exclusive).
            //nextInt(int origin, int bound)
            // nextInt is normally exclusive of the top value,
            // so add 1 to make it inclusive
            randomNum = ThreadLocalRandom.current().nextInt(8, 20 + 1);
            
            if(!(repeticion==1)) {
                while ((randomNum == randomNumPrev) )
                    randomNum = ThreadLocalRandom.current().nextInt(8, 20 + 1);
            }

            llaveObj.llaveSol.add(randomNum);

            switch(randomNum){
            case 8: 
                        llaveObj.C4++;
                  break;
            case 9: 
                        llaveObj.D4++;
                  break;
            case 10: 
                        llaveObj.E4++;
                  break;
            case 11: 
                        llaveObj.F4++;
                  break;
            case 12: 
                        llaveObj.G4++;
                  break;
            case 13: 
                        llaveObj.A4++;
                  break;
            case 14: 
                        llaveObj.B4++;
                  break;
            case 15: 
                        llaveObj.C5++;
                  break;
            case 16: 
                        llaveObj.D5++;
                  break;
            case 17: 
                        llaveObj.E5++;
                  break;
            case 18: 
                        llaveObj.F5++;
                  break;
            case 19: 
                        llaveObj.G5++;
                  break;
            case 20: 
                        llaveObj.A5++;
                  break;        
                case 21:
                        llaveObj.B5++;
                        break;
            }   
            
            randomNumPrev=randomNum;
        }

        Juntar(llaveObj);

        
    }

    public static void Juntar(Nota llaveObj) {
        int e = 0;
        int i = 0;

        for (; i < llaveObj.llaveSol.size(); i++){
            System.out.print(NotaStr.notas[llaveObj.llaveSol.get(i)]+" ");
            if((i+1) % 25 == 0 && i != 0) {
                System.out.println("");
                for (; e < llaveObj.llaveFa.size(); e++){
                    System.out.print(NotaStr.notas[llaveObj.llaveFa.get(e)]+" ");
                    if((e+1) % 25 == 0 && e != 0) {
                        System.out.println("");
                        System.out.println("");
                        e++;
                        break;
                    }
                }       
            }
        }
        System.out.printf("C3:%d  D3:%d  E3:%d  F3: %d  G3:%d  A3:%d  B3:%d\n"+
                "C4:%d  D4:%d  E4:%d  F4:%d  G4:%d  A4:%d  B4:%d"+
                "C5:%d  D5:%d  E5:%d  G5:%d  F5:%d  A5:%d  B5:%d\n", llaveObj.C3, llaveObj.D3, llaveObj.E3, llaveObj.F3, llaveObj.G3, llaveObj.A3, llaveObj.B3, llaveObj.C4, llaveObj.D4, llaveObj.E4, llaveObj.F4, llaveObj.G4, llaveObj.A4, llaveObj.B4, llaveObj.C5, llaveObj.D5, llaveObj.E5, llaveObj.F5, llaveObj.G5, llaveObj.A5, llaveObj.B5);
    }
}

這一行的錯誤llaveObj.llaveFa.add(randomNum); 來自llaveFa的未初始化。 讓我解釋一下,在“Nota” class 中,您在這一行中聲明ArrayList<Integer> llaveSol, llaveFa; llaveFa 和 llaveSol 使用 null 初始化,要解決此問題,您可以在 class 本身中初始化變量,如下所示: ArrayList<Integer> llaveFa = new ArrayList<Integer>();

暫無
暫無

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

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