【问题标题】:Bank account program. NullPointerException error [duplicate]银行账户计划。 NullPointerException 错误 [重复]
【发布时间】:2015-03-21 00:36:12
【问题描述】:

我正在为我的 Java 课程开发银行账户程序。我对此还是很陌生,这是我们第一个使用数组的任务。所以请原谅任何菜鸟的错误哈哈。目前,该分配需要一组 3 个银行帐户。我需要 3 节课;银行(包含 bankAcct myAcct[] = new bankAcct)、bankUser 和 bankAcct(包含我的提款、存款和查看余额方法)。到目前为止,每当我尝试查看余额、存款或取款时,我的 proChoice 方法中都会出现 NullPointerException。错误在我的 User 类中,我将在代码中留下 cmets 以准确显示位置。请,任何帮助将不胜感激。我正在阅读我的教科书,但并没有真正找到对我的特定问题有帮助的东西。提前谢谢你。

bankAcct 类

import java.util.Scanner;

public class bankAcct 
{

private double Bal;
private int acctNum;
private String name;

Scanner scannerObject = new Scanner(System.in);

    public bankAcct(int pacctNum, double pBal, String pname) {
        pBal = Bal;
        pacctNum = acctNum;
        pname = name;
    }   


    public void makeDeposit()
    {
        System.out.print( "Hello " + name + ", please, enter amount to deposit $");
        double lDep;
        lDep = scannerObject.nextDouble();
        Bal = Bal + lDep;
        System.out.println( " You have deposited $" + lDep);
        System.out.println( " Your new balance is $" + Bal);
    }

    public void makeWithdrawal()
    {
        System.out.print( "Hello " + name + ", please, enter amount to withdraw $");
        double lWDraw;
        lWDraw = scannerObject.nextDouble();
        if (lWDraw <= Bal){
            Bal = Bal - lWDraw;
            System.out.println( "You have withdrawn $" + lWDraw);
            System.out.println( "Your new balance is $" + Bal);
        }else{
                System.out.println("Insufficient funds!");
             }
    }

    public void dispBal()
    {
        System.out.println( "Your current balance is $" + Bal);
    }


        public void setAcctNum(int pacctNum)
        {
            pacctNum = acctNum;
        }

        public int getAcctNum()
        {
            return acctNum;
        }

        public void setName(String pname)
        {
            pname = name;
        }

        public String getName()
        {
            return name;
        }


 }

银行类

import java.util.Scanner;

public class Bank 
{
int max = 3;
int count;
bankAcct myAcct[] = new bankAcct[max];
bankUser user = new bankUser();
Scanner scannerObject = new Scanner(System.in);

public void openAcct()
{
    String lname;
    if (count >= max){
        System.out.println("Not accepting new customers at this time.");
    }else{
        System.out.println("Please enter your name: ");
        lname = scannerObject.nextLine();
        myAcct[count] = new bankAcct(count + 1, 0, lname);
        count++;
        System.out.println("Thank you " + lname + ", your account number is:       " + count);
        }

}


public int findAcct()
{
    int lnum = -1;
    System.out.println("Greetings, please enter your account number: ");
    lnum = scannerObject.nextInt();
    for(count = 0; count < max; count++){
        if (count == lnum)
            return count;
            }
    return lnum;
    }

public void seeBal()
{
    int lfound = findAcct();
    if (lfound == -1)
    {
        System.out.println("Error!");
    }else{
        myAcct[lfound].dispBal();
    }
}

void Deposit()
{
    int lfound = findAcct();
    if (lfound == -1)
    {
        System.out.println("Error!");
    }else{
        myAcct[lfound].makeDeposit();
    }
}

void Withdrawal()
{
    int lfound = findAcct();
    if (lfound == -1)
    {
        System.out.println("Error!");
    }else{
        myAcct[lfound].makeWithdrawal();
    }
}   
}   

用户类

import java.util.Scanner;

public class bankUser 
{
public static void main(String[] args) 

{
    Bank myBank = new Bank();
    Scanner scannerObject = new Scanner(System.in);
    int Choice; 

    do
    {
    dispMenu();

    Choice = getChoice(scannerObject);

    proChoice(Choice, myBank); ***//Error occurring here***
    }   
    while (Choice !=0);
}


public static void dispMenu()
{
    System.out.println( "|==================================|");
    System.out.println( "|    TONY'S FIRST NATIONAL BANK    |");
    System.out.println( "|***********Menu Options***********|");
    System.out.println( "|__________________________________|");
    System.out.println( "|  Press 1 To Open New Account     |");
    System.out.println( "|  Press 2 To View Balance         |");
    System.out.println( "|  Press 3 To Make Deposit         |");
    System.out.println( "|  Press 4 To Make Withdrawal      |");
    System.out.println( "|  Press 0 to Exit                 |");
    System.out.println( "|__________________________________|");
    System.out.println( "|   Please Make Selection Now...   |");
    System.out.println( "|==================================|");
}

static int getChoice(Scanner scannerObject)
{
    int pChoice, Choice;
    pChoice = scannerObject.nextInt();  
    Choice = pChoice;
    return Choice;
}

static void proChoice(int Choice, Bank myBank)
{
    switch (Choice)
    {
        case 1: myBank.openAcct();
        break;
        case 2: myBank.seeBal(); //***Error Here***
        break;
        case 3: myBank.Deposit(); //***Error Here***
        break;
        case 4: myBank.Withdrawal(); //***Error Here***
        break;
        case 0: System.out.println( "Thank you, come again.");
        break;
    }
}
}

【问题讨论】:

  • 1) 您给出了具体的问题描述,包含了源代码,并且清楚地努力调试 - 好!谢谢! 2)我添加了“java”标签来指定你的语言——这有助于你更快地获得更好的答案。 3) 在这种情况下,我强烈建议您使用调试器。我不知道您使用的是哪个 Java 编译器/调试器/(IDE?)。但绝对要单步执行代码,准确找到 NPE 发生的位置 - 并简单地查看此时哪个变量未初始化。祝你好运!
  • 谢谢!我正在使用 Eclipse。我会彻底完成它。我可能遗漏了一些明显的东西,这周我有 5 个期中考试。所以,我有点筋疲力尽了,哈哈。再次感谢!

标签: java arrays nullpointerexception


【解决方案1】:

你有几个问题。我解决了第一个,但它会涉及到第二个和第三个。第一个问题是如何创建帐户。您当前的构造函数是:

    public bankAcct(int pacctNum, double pBal, String pname) 
{
    pBal = Bal;
    pacctNum = acctNum;
    pname = name;
} 

应该是这样的:

        public bankAcct(int pacctNum, double pBal, String pname) 
    {
        Bal = pBal;
        acctNum = pacctNum;
        name = pname;
    } 

此处的值颠倒了,这使您无法将帐号、姓氏和余额分配给您创建的帐户。

其次,您的 findAcctseeBalance 方法应如下所示:

    public bankAcct findAcct()
{
    bankAcct myBankAcct = null;
    System.out.println("Greetings, please enter your account number: ");
    int acctNum = scannerObject.nextInt();
    //make sure you use myAcct.length to ensure you don't get an "ArrayOutOfBoundsIndex" error.
    for(count = 0; count < myAcct.length; count++){
        myBankAcct = myAcct[count];
        if(myBankAcct.getAcctNum() == acctNum){
            return myBankAcct;
        }
    }
    return myBankAcct;
 }

public void seeBal()
{
    bankAcct lfound = findAcct();
    if (lfound == null)
    {
        System.out.println("Error!");
    }else{
        lfound.dispBal();
    }
}

你最大的问题是你的findAcct 方法。您从未找到该帐户。这就是你所做的:

    public int findAcct()
{
    int lnum = -1;
    System.out.println("Greetings, please enter your account number: ");
    //you get the users acct #
    lnum = scannerObject.nextInt();
    for(count = 0; count < max; count++){ //here you iterate, but you never "find" the account
        if (count == lnum)
            return count; //then you return the "count" rather than the account itself.
            }
    return lnum;
    }

如果您进行我所做的更改,它将通过选项 2,但您将不得不处理一些错误。如果您从这篇文章中吸取了教训,您应该能够解决您在程序中遇到的其他问题。您应该能够使您的 DepositWithdraw 方法看起来像 seeBalance 方法。

这是我运行的输出

    |==================================|
|    TONY'S FIRST NATIONAL BANK    |
|***********Menu Options***********|
|__________________________________|
|  Press 1 To Open New Account     |
|  Press 2 To View Balance         |
|  Press 3 To Make Deposit         |
|  Press 4 To Make Withdrawal      |
|  Press 0 to Exit                 |
|__________________________________|
|   Please Make Selection Now...   |
|==================================|
1
Please enter your name: 
Blaine
Thank you Blaine, your account number is:       1
|==================================|
|    TONY'S FIRST NATIONAL BANK    |
|***********Menu Options***********|
|__________________________________|
|  Press 1 To Open New Account     |
|  Press 2 To View Balance         |
|  Press 3 To Make Deposit         |
|  Press 4 To Make Withdrawal      |
|  Press 0 to Exit                 |
|__________________________________|
|   Please Make Selection Now...   |
|==================================|
2
Greetings, please enter your account number: 
1
Your current balance is $0.0
|==================================|
|    TONY'S FIRST NATIONAL BANK    |
|***********Menu Options***********|
|__________________________________|
|  Press 1 To Open New Account     |
|  Press 2 To View Balance         |
|  Press 3 To Make Deposit         |
|  Press 4 To Make Withdrawal      |
|  Press 0 to Exit                 |
|__________________________________|
|   Please Make Selection Now...   |
|==================================|

我希望这会有所帮助:)

【讨论】:

  • 非常感谢先生!我看到我做错了什么。我非常不确定需要在我的 find 帐户中返回什么,而且我的导师对这种方法非常害羞,哈哈。但只有一个问题 bankAcct myBankAcct = null;我可以使用bankAcct myAcct,还是有理由在这里需要不同的bankAcct obj?我只是想确保我完全理解......但再次感谢您!节省了我几个小时的疯狂哈哈
  • @TonyVega 你不能使用myAcct,因为它已经被声明为bankAcct 的数组。通过执行bankAcct myBankAcct = null,您正在创建对帐户的单一引用。通过使其为空,您可以检查它的其他方法以确保它被分配了一个值。如果它解决了您的问题,请随时接受!
  • 太棒了!我明白。再次感谢你的帮助。我仍然是一名 Padawan 学习者,但希望能变得更好......
  • 没问题。很高兴我能帮上忙。
猜你喜欢
  • 2011-12-07
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2014-08-27
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多