我试过制作一个程序,但是控制台仍然显示“线程中的异常”主“java.lang.NullPointerException”,我不知道是什么问题

时间:2014-02-15 15:01:36

标签: java nullpointerexception

该程序应该像这样工作:

首先它从用户获得SENTENCE(字符串)和MUTATION因子(double)。然后它将字符串SENTENCE更改为chars数组(ARRAY 1)。之后它会生成5个新的char数组,其长度等于ARRAY 1的长度。它们中的每一个都充满了随机字符(只有字母和空格)。然后程序选择与ARRAY 1最相似的5个中的一个。获胜者“乘以”到下面的5个数组中。在每个程序中,程序验证是否符合ARRAY 1.如果char适合ARRAY 1中的字符,则程序不会更改它。如果char不适合ARRAY 1中的char,则它会变异或不变(根据MUTATION因子和随机概率)。然后程序选择一个与ARRAY 1最相似的数组,获胜者“mulitplies”等。程序工作直到程序所生成的数组与ARRAY 1相同。'Counter'(static int)计算有数组的“代数”在程序制作正确的数组之前通过。

我怀疑最后一种方法可能有问题。但我真的不知道它是什么。这是我写的代码:

static int counter;
public static void main(String[] args) {

    Scanner skaner = new Scanner(System.in);
    String sentence = skaner.nextLine();
    double mutation = Double.parseDouble(skaner.nextLine());

//
        ArrayList<char[]> candidates = Draw(ChangeIntoChars(sentence), mutation);
        char[] candidate = ChooseTheBestOne(candidates,
                ChangeIntoChar(sentence));
        String result = CheckAndDraw(candidate, ChangeIntoChars(sentence),
                mutation);
        System.out.print(result);
        System.out.println();
        System.out.print(counter);
}

    public static char[] ChangeIntoChars (String sentence) {

        char[] chars = sentence.toCharArray();
        return chars;
    }



    public static ArrayList<char[]> Draw (char [] chars, double mutation) {

        char [] random1 = new char [chars.length];
        char [] random2 = new char [chars.length];
        char [] random3 = new char [chars.length];
        char [] random4 = new char [chars.length];
        char [] random5 = new char [chars.length];

        Random r = new Random();


        for (int i=0; i<random1.length; i++) {
            if          (random1[i]==chars[i]) {}
            else        {double p = Math.random();
                        if (mutation>p){
                String alphabet = "aąbcćdeęfghijklłmnńoópqrsśtuwxyzżź ";
                random1[i]=(alphabet.charAt(r.nextInt(alphabet.length())));
                        }
                        else {}
                        }}

        for (int i=0; i<random2.length; i++) {
            if      (random2[i]==chars[i]) {}
            else        {double p = Math.random();
                        if (mutation>p){
                String alphabet = "aąbcćdeęfghijklłmnńoópqrsśtuwxyzżź ";
                random2[i]=(alphabet.charAt(r.nextInt(alphabet.length())));
                        }
                        else {}
                        }}

        for (int i=0; i<random3.length; i++) {
            if      (random3[i]==chars[i]) {}
            else        {double p = Math.random();
                        if (mutation>p){
                String alphabet = "aąbcćdeęfghijklłmnńoópqrsśtuwxyzżź ";
                random3[i]=(alphabet.charAt(r.nextInt(alphabet.length())));
                        }
                        else {}
                        }}

        for (int i=0; i<random4.length; i++) {
            if      (random4[i]==chars[i]) {}
            else        {double p = Math.random();
                        if (mutation>p){
                String alphabet = "aąbcćdeęfghijklłmnńoópqrsśtuwxyzżź ";
                random4[i]=(alphabet.charAt(r.nextInt(alphabet.length())));
                        }
                        else {}
                        }}

        for (int i=0; i<random5.length; i++) {
            if      (random5[i]==chars[i]) {}
            else        {double p = Math.random();
                        if (mutation>p){
                String alphabet = "aąbcćdeęfghijklłmnńoópqrsśtuwxyzżź ";
                random5[i]=(alphabet.charAt(r.nextInt(alphabet.length())));
                        }
                        else {}
                        }}


        ArrayList<char[]> candidates = new ArrayList<char[]>();
        candidates.add(random1);
        candidates.add(random2);
        candidates.add(random3);
        candidates.add(random4);
        candidates.add(random5);

        return candidates;
    }
    public static char [] ChooseTheBestOne(ArrayList<char[]>candidates,char[]chars) {

        char [] number1 = candidates.get(0);
        char [] number2 = candidates.get(1);
        char [] number3 = candidates.get(2);
        char [] number4 = candidates.get(3);
        char [] number5 = candidates.get(4);

        int j = 0;
        for (int i=0; i<number1.length; i++){
            if (number1[i]==chars[i]){
                j++;}
            }

        int k = 0;
        for (int i=0; i<number2.length; i++){
            if (number2[i]==chars[i]){
                k++;}
            }

        int l = 0;
        for (int i=0; i<number3.length; i++){
            if (number3[i]==chars[i]){
                l++;}
            }

        int m = 0;
        for (int i=0; i<number4.length; i++){
            if (number4[i]==chars[i]){
                m++;}
            }

        int n = 0;
        for (int i=0; i<number5.length; i++){
            if (number5[i]==chars[i]){
                n++;}
            }

        int [] whosTheWinner = {j,k,l,m,n};
        int max = 0;
        char[] winner = null;
        for (int x=0; x<whosTheWinner.length; x++) {
            if (whosTheWinner[x]> max) {max = whosTheWinner[x];
                if  (x==0) {winner = number1;}
                else if (x==1) {winner = number2;}
                else if (x==2) {winner = number3;}
                else if (x==3) {winner = number4;}
                else if (x==4) {winner = number5;}

        }}
        counter++;
        return winner ;
        }
    public static String CheckAndDraw (char[]winner,char[]chars,double mutation){
        int i = 0;
        String end = "This is not what I meant.";

        boolean success;


        if (winner[i]==chars[i]){
            success = true;
            end = "END";
        }
        else {success = false;}


        while (success!=true){

            ArrayList<char[]> resultsOfTheDraw = Draw(winner, mutation);
            winner = ChooseTheBestOne(resultsOfTheDraw, chars);

            }



        return end;

        }
    }

1 个答案:

答案 0 :(得分:1)

您的问题是,在方法ChooseTheBestOne()中,在方法结尾的if-else梯形图中,有时没有条件为真,因此winner保持为空。您需要在该梯形图中添加else子句,以便为winner分配内容。