【问题标题】:Cannot find NullPointerException in lottery application [duplicate]在彩票应用程序中找不到 NullPointerException [重复]
【发布时间】:2018-04-15 08:16:26
【问题描述】:

我正在制作一个程序,该程序制作一张随机乐透彩票并将其与用户的一组数字进行比较。我的问题是我找不到NullPointerException 的错误。我也觉得我比较数字的方法不是最理想的,但我想不出更好的方法来编写它。

package lotteryapplication;

import java.util.Random;
import java.util.Scanner;

public class LotteryApplication {

    public static int lotteryNumbers[];
    public static int usersNumbers[] = new int[5];

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        System.out.println(
                " This is the lottery. Numbers in my lottery range from 1 through 60.");
        System.out.println(" See if you can win\n");
        getUserPicks();
        getRandomNumbers();
        checkLotteryMatch();
    }

    public static void getUserPicks() {
        Scanner keyboard = new Scanner(System.in);
        for (int i = 0; i < 5; i++) {
            System.out.print(String.format(
                    "Enter a Number from 1 through 60 for spot :" + (i + 1))
                    + "\n");
            usersNumbers[i] = keyboard.nextInt();
            keyboard.nextLine();
        }
    }

    public static void getRandomNumbers() {
        int lotteryNumbers[] = new int[5];
        Random r = new Random();
        for (int i = 0; i < 5; i++) {
            lotteryNumbers[i] = r.nextInt(60) + 1;
        }
    }

    public static void checkLotteryMatch() {
        int matchedNums = 0;
        if (usersNumbers.length == lotteryNumbers.length) {

            for (int i = 0; i < lotteryNumbers.length; i++) {
                if (usersNumbers[0] == lotteryNumbers[i]) {
                    matchedNums++;
                }
            }
            for (int i = 0; i < lotteryNumbers.length; i++) {
                if (usersNumbers[1] == lotteryNumbers[i]) {
                    matchedNums++;
                }
            }
            for (int i = 0; i < lotteryNumbers.length; i++) {
                if (usersNumbers[2] == lotteryNumbers[i]) {
                    matchedNums++;
                }
            }
            for (int i = 0; i < lotteryNumbers.length; i++) {
                if (usersNumbers[3] == lotteryNumbers[i]) {
                    matchedNums++;
                }
            }
            for (int i = 0; i < lotteryNumbers.length; i++) {
                if (usersNumbers[4] == lotteryNumbers[i]) {
                    matchedNums++;
                }
            }
            for (int i = 0; i < lotteryNumbers.length; i++) {
                if (usersNumbers[5] == lotteryNumbers[i]) {
                    matchedNums++;
                }
            }
        }
        if (matchedNums == 1) {
            System.out.println("You only got one match sorry you win nothing.");
        }
        if (matchedNums == 2) {
            System.out.println("You only got two matched sorry you win nothing");
        }
        if (matchedNums == 3) {
            System.out.println(
                    "you will recieve a free Lottery ticket as the prize");
        }
        if (matchedNums == 4) {
            System.out.println("You will recieve a $2,000 prize");
        }
        if (matchedNums == 5) {
            System.out.println("You will recieve a 500,000 prize");
        }
        if (matchedNums == 6) {
            System.out.println("You will recieve a grand prize of $1,000,000");
        }
    }
}

【问题讨论】:

  • 你能发布你的错误堆栈跟踪吗?
  • 你永远不会初始化lotteryNumbers

标签: java arrays nullpointerexception


【解决方案1】:

NullPointerException 位于 checkLotteryMatch 中,因为 lotteryNumbers[] 数组尚未初始化。

我修改了您的程序以使用 java.util Collections 包中的类。

package lotteryapplication;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;

public class LotteryApplication {
    private static final int CAPACITY = 5;
    private Set<Integer> lotteryNumbers = new HashSet<>(CAPACITY);
    private List<Integer> userPicks = new ArrayList<>(CAPACITY);

    /**
     * @param args
     *            the command line arguments
     */
    public static void main(String[] args) {
        new LotteryApplication().run();
    }

    private void run() {
        System.out.println(" This is the lottery. Numbers in my lottery range from 1 through 60.");
        System.out.println(" See if you can win\n");
        getUserPicks();
        getRandomNumbers();
        checkLotteryMatch();
    }

    public void getUserPicks() {
        try (Scanner keyboard = new Scanner(System.in)) {
            for (int i = 0; i < 5; i++) {
                System.out.print(String.format("Enter a Number from 1 through 60 for spot :" + (i + 1)) + "\n");
                userPicks.add(keyboard.nextInt());
                keyboard.nextLine();
            }
        }
    }

    public void getRandomNumbers() {
        Random r = new Random();
        for (int i = 0; i < 5; i++)
            lotteryNumbers.add(r.nextInt(60) + 1);
    }

    public void checkLotteryMatch() {
        int matchedNums = 0;

        if (userPicks.size() == lotteryNumbers.size()) {
            for (Integer lottery : lotteryNumbers) {
                if (userPicks.contains(lottery)) {
                    matchedNums++;
                }
            }
        }

        switch (matchedNums) {
        case 0:
             System.out.println("Better luck next time.");
             break;

        case 1:
            System.out.println("You only got one match sorry you win nothing.");
            break;

        case 2:
            System.out.println("You only got two matched sorry you win nothing");
            break;

        case 3:
            System.out.println("you will recieve a free Lottery ticket as the prize");
            break;

        case 4:
            System.out.println("You will recieve a $2,000 prize");
            break;

        case 5:
            System.out.println("You will recieve a 500,000 prize");
            break;

        case 6:
            System.out.println("You will recieve a grand prize of $1,000,000");
            break;
        }
    }
}

【讨论】:

    【解决方案2】:

    很简单,这是一个错字。在您的 getRandomNumbers() 方法中,第一行有这个:

    int lotteryNumbers[] = new int[5];
    

    因为你已经把int放在了行首,这意味着该方法正在声明一个新的本地方法变量,所以该方法正在处理这个本地变量并完全忽略您在类开始时声明的类字段。所以在其他方法中,当他们引用lotteryNumbers时,他们指的是从未用任何值初始化的类字段。

    要修复NullPointerException 异常,您可能只需要从这行代码中删除关键字int,以便该方法不再创建局部变量而是使用类字段。

    【讨论】:

      【解决方案3】:

      如果您只是评论了 NullpointerException 的输出,那将非常有帮助,因为这总是告诉它在哪里被触发。对于您的下一个问题,检查数字有一些解决方案。

      1. 你可以使用地图

        Map<Integer, String> map = new HashMap<>(); //Or any other map you prefer
        map.put(1, "....");
        .
        .
        .
        
        if(map.contains(matchedNums)) System.out.println(map.get(matchedNums); 
        else DOSTUFF //maybe an Exception
        
      2. 但在您的情况下,我宁愿使用数组,因为它更快一点,并且不会像地图那样产生太多开销。考虑到您的小程序,这应该不是问题,但我更愿意提前考虑。

        String[] messages = new String[]{"1....", "2....", ...};
        if(matchedNums < messages.length) System.out.println(messages[matchedNums]); 
        else DOSTUFF //maybe an Exception
        
      3. 如果你像我一样是函数迷,你也会做这样的事情。

        String[] messages = new String[]{"1....", "2....", ...};
        Optional.ofNullable(matchedNums).map(i -> messages[i]).ifPresent(System.out::println);
        

      有很多选择,你可以选择最适合你的。

      【讨论】:

        猜你喜欢
        • 2015-11-26
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        • 2018-10-30
        • 1970-01-01
        相关资源
        最近更新 更多