How would I make the readability better in Java - java

I feel like the amount of while loops nested into each other isn't too readable and could be simplified down but I'm not sure how I can simplify it down. Could someone let me know what I would have to do to simplify this. I'm not sure how I would convert these while loops to methods because my variables are in the main method. I'm pretty new to Java so any help would be appreciated.
import java.util.Scanner;
public class Payroll
{
public static void main(String[] args)
{
//init scanner
Scanner reader = new Scanner(System.in);
//var
boolean repeat = true; //keeps or breaks loop
String strHWage; //input for hourly wage
double dblHWage; //clctd for hourly wage from strHWage
String strHours; //input for hours worked
double dblHours; //clctd for hours worked
String strOverHours; //input for overtime hours
double dblOverHours; //clctd for overtime hours
double totalPay; //clctd total pay
//dscrp of prgrm to usr
System.out.println();
System.out.println("Calculate your weekly pay");
System.out.println("Entering \"exit\" at any type will bring you back to the manager");
System.out.println();
//setting repeat to true
repeat = true;
while (repeat == true)
{
//rqst input for hourly wage
System.out.print("Enter hourly wage: $");
strHWage = reader.next();
System.out.println();
outerloop:
while (isNumeric(strHWage))
{
if (strHWage.equalsIgnoreCase("exit"))
{
repeat = false;
//bring to manager
System.out.println("Program terminated, going to manager\n");
Manager.main(args);
}
else if (isNumeric(strHWage))
{
//str -> dbl
dblHWage = Double.parseDouble(strHWage);
//rqst hours worked
System.out.print("Enter hours worked: ");
strHours = reader.next();
System.out.println();
while (isNumeric(strHours))
{
if(strHours.equalsIgnoreCase("exit"))
{
repeat = false;
//bring to manager
System.out.println("Program terminated, going to manager\n");
Manager.main(args);
}
else if (isNumeric(strHours))
{
//str -> dbl
dblHours = Double.parseDouble(strHours);
//rqst overtime hours worked
System.out.print("Enter overtime hours worked: ");
strOverHours = reader.next();
System.out.println();
while (isNumeric(strOverHours))
{
if (strOverHours.equalsIgnoreCase("exit"))
{
repeat = false;
//bring to manager
System.out.println("Program terminated, going to manager\n");
Manager.main(args);
}
else if (isNumeric(strOverHours))
{
//str -> dbl
dblOverHours = Double.parseDouble(strOverHours);
//clctd $ earned
totalPay = (dblHWage * dblHours) + ((dblHWage * 1.5) * dblOverHours);
//prnt total $ earned
System.out.println("your weekly pay is $" + String.format("%.2f", totalPay));
System.out.println();
break outerloop;
}
}
if (!isNumeric(strOverHours))
{
System.out.println("please enter an actual number.\n");
}
}
}
if (!isNumeric(strHours))
{
System.out.println("please enter an actual number.\n");
}
}
}
if (!isNumeric(strHWage))
{
System.out.println("please enter an actual number.\n");
}
}
}
//FUNCITON TO CHECK STR NUMERIC BEFORE PARSING
public static boolean isNumeric(String str)
{
try
{
Double.parseDouble(str); //parses string if string value is numerical
return true;
}
catch(NumberFormatException ex) //returns false and does not parse if string value is not numerical
{
return false;
}
}
}

You can simplify your code by breaking it down into smaller functions. I have done some refactoring in your code, but this can further be improved:-
import java.util.Scanner;
public class Payroll {
//setting repeat to true
static Boolean repeat = true;
public static void main(String[] args) {
//init scanner
Scanner reader = new Scanner(System.in);
//dscrp of prgrm to usr
System.out.println("\nCalculate your weekly pay");
System.out.println("Entering \"exit\" at any type will bring you back to the manager\n");
while (repeat) {
//rqst input for hourly wage
System.out.print("Enter hourly wage: $");
String strHWage = reader.next();
System.out.println();
outerloop:
if (isNumeric(strHWage)) {
//str -> dbl
double dblHWage = Double.parseDouble(strHWage);
//rqst hours worked
System.out.print("Enter hours worked: ");
String strHours = reader.next();
System.out.println();
if (isNumeric(strHours)) {
//str -> dbl
double dblHours = Double.parseDouble(strHours);
//rqst overtime hours worked
System.out.print("Enter overtime hours worked: ");
String strOverHours = reader.next();
System.out.println();
if (isNumeric(strOverHours)) {
//str -> dbl
double dblOverHours = Double.parseDouble(strOverHours);
//clctd $ earned
double totalPay = (dblHWage * dblHours) + ((dblHWage * 1.5) * dblOverHours);
//prnt total $ earned
System.out.println("your weekly pay is $" + String.format("%.2f", totalPay));
System.out.println();
break outerloop;
} else {
validateInput(strOverHours, args);
}
} else {
validateInput(strHours, args);
}
} else {
validateInput(strHWage, args);
}
}
}
public static void validateInput(String input, String[] args) {
if (input.equalsIgnoreCase("exit")) {
repeat = false;
//bring to manager
System.out.println("Program terminated, going to manager\n");
Manager.main(args);
} else {
System.out.println("please enter an actual number.\n");
}
}
//FUNCITON TO CHECK STR NUMERIC BEFORE PARSING
public static boolean isNumeric(String str) {
try {
Double.parseDouble(str); //parses string if string value is numerical
return true;
} catch (NumberFormatException ex) //returns false and does not parse if string value is not numerical
{
return false;
}
}
}

Related

how should i make the code give an error if the values are incorrect

I don't know how, but I must add something that gives a massage that the input was wrong if it's a negative vale or a char
package javaapplication6;
import java.util.Scanner;
public class JavaApplication6 {
public static void main(String[] args) {
System.out.print("type in the age: ");
Scanner scn=new Scanner(System.in);
double age=scn.nextDouble();
System.out.print("select your gender (0: female, 1: male):");
double gender=scn.nextDouble();
System.out.print("entere your bp: ");
double bp=scn.nextDouble();
if(age>45){//old male
if(gender==1){
if(bp<12){
System.out.print("bp is low for old man. ");
}
else if(bp>15){
System.out.print("bp is high for old man.");
}
else if(!(bp<12 || bp>15)){
System.out.print("the bp is normal for an old man. ");
}
else {
System.out.print("the value is incorect, please try again");
}
}
}
if(age>45){//old female
if(gender==0){
if(bp<12){
System.out.print("bp is low for old woman. ");
}
else if(bp>14){
System.out.print("bp is high for old woman.");
}
else if(!(bp<12 || bp>14)){
System.out.print("the bp is normal for an old woman. ");
}
else{
System.out.print("the value is incorect, please try again");
}
}
}
}
}
you can do in this way - If any value will be invalid it will take input again rather then throwing.
public static void main(String[] args) {
boolean wrongAge = false;
boolean wrongGender = false;
boolean wrongBP = false;
Scanner scn = null;
double age = 0;
double gender = 0;
double bp = 0;
do{
try{
scn=new Scanner(System.in);
System.out.print("type in the age: ");
wrongAge = false;
age=scn.nextDouble();
}catch(InputMismatchException ime){
wrongAge = true;
}
}while(wrongAge);
do{
try{
scn=new Scanner(System.in);
System.out.print("select your gender (0: female, 1: male):");
wrongGender = false;
gender=scn.nextDouble();
}catch(InputMismatchException ime){
wrongGender = true;
}
}while(wrongGender);
do{
try{
scn=new Scanner(System.in);
System.out.print("entere your bp: ");
wrongBP = false;
bp=scn.nextDouble();
}catch(InputMismatchException ime){
wrongBP = true;
}
}while(wrongBP);
if(age>0){
if(age>45){//old male
if(gender==1){
if(bp<12){
System.out.print("bp is low for old man. ");
}
else if(bp>15){
System.out.print("bp is high for old man.");
}
else if(!(bp<12 || bp>15)){
System.out.print("the bp is normal for an old man. ");
}
else {
System.out.print("the value is incorect, please try again");
}
}
}
if(age>45){//old female
if(gender==0){
if(bp<12){
System.out.print("bp is low for old woman. ");
}
else if(bp>14){
System.out.print("bp is high for old woman.");
}
else if(!(bp<12 || bp>14)){
System.out.print("the bp is normal for an old woman. ");
}
else{
System.out.print("the value is incorect, please try again");
}
}
}
}else{
System.out.print("Incorect age !!!");
}
}
The easiest way is to throw a RunTimeException at any position of your code, like below.
throw new RuntimeException("your message here.");

NoSuchElementException with java.util.scanner in school project

I am working on a school project. I have all the functionality working, I made it on Eclipse and it runs very well but when I submit the project through Mimir which is an online tool to grade your project, during deposits and withdraws it gives the following error:
Enter the amount you want to Deposit :$Exception in thread "main" java.util.NoSuchElementException
13 at java.util.Scanner.throwFor(Scanner.java:862)
14 at java.util.Scanner.next(Scanner.java:1485)
15 at java.util.Scanner.nextDouble(Scanner.java:2345)
16 at BankAccount.deposit(BankAccount.java:24)
17 at SavingsAccountDemo.main(SavingsAccountDemo.java:30)
The project does says the following: Please make sure that your classes throw appropriate exceptions when an attempt is made to insert invalid data.
I tried to add the try and catch with java.util.InputMismatchException e and java.util.NoSuchElementException but it doesn't seem to be fixing it. I think it's because the userInput is a double and they are entering something different. Any ideas how can I fix that? I am going crazy, been trying to fix it for hours. Here is the code:
///SavingsAccountDemo class
import java.util.*;
public class SavingsAccountDemo {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
double startingBalance;
double interestRate;
String userInput;
System.out.print("Enter beginning balance :$");
startingBalance = keyboard.nextDouble();
System.out.print("Enter interest rate(whole number) :%");
interestRate = keyboard.nextDouble();
double bal = startingBalance;
double rate = interestRate;
BankAccount ba = new BankAccount(startingBalance, interestRate);
BankDemo sv = new BankDemo(bal, rate);
while(startingBalance > -1) {
try {
System.out.println("Enter D for deposit" + "\nEnter W to Withdraw" + "\nEnter B for Balance" +
"\nEnter M for Monthly Process" + "\nEnter E to Exit");
userInput = keyboard.next().toLowerCase();
if("d".equals(userInput)) {
ba.deposit();
} else if("w".equals(userInput)) {
ba.withdraw();
} else if("b".equals(userInput)) {
ba.totalBalance();
} else if("m".equals(userInput)) {
ba.monthlyProcess();
} else if("e".equals(userInput)) {
ba.exit();
break;
}
else {
System.out.print("Error, option not valid\n");
}
}
catch (java.util.InputMismatchException e) {
System.out.print("Error");
}
}
}
}
///BankAccount class
import java.util.*;
public class BankAccount {
protected double balance;
protected double numDeposits;
protected double numWithdrawals;
protected double annualRate;
protected double monthlyServCharg;
protected boolean active;
Scanner keyboard = new Scanner(System.in);
public BankAccount(double startingBalance, double interestRate) {
balance = startingBalance;
annualRate = interestRate /= 100.0;
if(balance < 25) {
active = false;
} else
active = true;
}
public void deposit() {
try {
double valueD;
System.out.print("Enter the amount you want to Deposit :$");
valueD = keyboard.nextDouble();
if(valueD < 0) {
System.out.println("Error: Must enter positive value\n");
}
if( balance + valueD >= 25 && !active) {
System.out.print("Your account is now ACTIVE\n");
active = true;
}
balance += valueD;
numDeposits++;
}
catch (java.util.InputMismatchException e){
keyboard.nextLine();
}
}
public void withdraw() {
try {
double valueW;
System.out.print("Enter the amount you want to withdraw :$");
valueW = keyboard.nextDouble();
if(valueW < 0) {
System.out.println("Error: Must enter positive value\n");
}
balance -= valueW;
numWithdrawals++;
if(balance < 0) {
System.out.print("ERROR: Transaction declined!! This transaction will cause overdraft or zero balance\n");
balance += valueW;
} else if(balance <= 25 && active) {
System.out.print("Your balance is less than minimum balance. Your account is now INACTIVE\n");
active = false;
}
if(numWithdrawals > 4) {
balance --;
System.out.print("You have exceeded monthly limit of withdrawals. Fee of $1 charged\n");
}
}
catch (java.util.InputMismatchException e) {
keyboard.nextLine();
}
}
public void totalBalance() {
System.out.printf("Your Balance is: %.2f\n", balance);
}
public void calcInterest() {
double monRate = annualRate / 12;
double monInt = balance * monRate;
balance += monInt;
}
public void monthlyProcess() {
calcInterest();
balance -= monthlyServCharg;
numWithdrawals = 0;
numDeposits = 0;
monthlyServCharg = 0;
System.out.printf("Your Balance after Monthly process is: %.2f\n", balance);
}
public void exit() {
totalBalance();
System.out.print("Thank you. Bye");
}
}
When scanning an input with Scanner, the expected result is always a String.
Therefore, you have to check if the field is a double before assuming it is. You can use a cast and check with a try catch if casting raises an NumberFormatException error. If it is the case, the input is not valid. Otherwise, you can use that newly casted double in your program.

Handle Scanner exception on Java program

I am working on a school project. I have all the functionality working but when I submit the project through Mimir, during deposits and withdraws it gives the following error:
Enter the amount you want to Deposit :$Exception in thread "main" java.util.NoSuchElementException
13 at java.util.Scanner.throwFor(Scanner.java:862)
14 at java.util.Scanner.next(Scanner.java:1485)
15 at java.util.Scanner.nextDouble(Scanner.java:2345)
16 at BankAccount.deposit(BankAccount.java:24)
17 at SavingsAccountDemo.main(SavingsAccountDemo.java:30)
The project does says the following: Please make sure that your classes throw appropriate exceptions when an attempt is made to insert invalid data.
I tried to add the try and catch with java.util.InputMismatchException e but it doesn't seem to be fixing it. I think it's because the userInput is a double and they are entering something different. Any ideas how can I fix that? Here is the code:
///SavingsAccountDemo class
import java.util.*;
public class SavingsAccountDemo {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
double startingBalance;
double interestRate;
String userInput;
System.out.print("Enter beginning balance :$");
startingBalance = keyboard.nextDouble();
System.out.print("Enter interest rate(whole number) :%");
interestRate = keyboard.nextDouble();
double bal = startingBalance;
double rate = interestRate;
BankAccount ba = new BankAccount(startingBalance, interestRate);
BankDemo sv = new BankDemo(bal, rate);
while(startingBalance > -1) {
try {
System.out.println("Enter D for deposit" + "\nEnter W to Withdraw" + "\nEnter B for Balance" +
"\nEnter M for Monthly Process" + "\nEnter E to Exit");
userInput = keyboard.next().toLowerCase();
if("d".equals(userInput)) {
ba.deposit();
} else if("w".equals(userInput)) {
ba.withdraw();
} else if("b".equals(userInput)) {
ba.totalBalance();
} else if("m".equals(userInput)) {
ba.monthlyProcess();
} else if("e".equals(userInput)) {
ba.exit();
break;
}
else {
System.out.print("Error, option not valid\n");
}
}
catch (java.util.InputMismatchException e) {
System.out.print("Error");
}
}
}
}
///BankAccount class
import java.util.*;
public class BankAccount {
protected double balance;
protected double numDeposits;
protected double numWithdrawals;
protected double annualRate;
protected double monthlyServCharg;
protected boolean active;
Scanner keyboard = new Scanner(System.in);
public BankAccount(double startingBalance, double interestRate) {
balance = startingBalance;
annualRate = interestRate /= 100.0;
if(balance < 25) {
active = false;
} else
active = true;
}
public void deposit() {
try {
double valueD;
System.out.print("Enter the amount you want to Deposit :$");
valueD = keyboard.nextDouble();
if(valueD < 0) {
System.out.println("Error: Must enter positive value\n");
}
if( balance + valueD >= 25 && !active) {
System.out.print("Your account is now ACTIVE\n");
active = true;
}
balance += valueD;
numDeposits++;
}
catch (java.util.InputMismatchException e){
keyboard.nextLine();
}
}
public void withdraw() {
try {
double valueW;
System.out.print("Enter the amount you want to withdraw :$");
valueW = keyboard.nextDouble();
if(valueW < 0) {
System.out.println("Error: Must enter positive value\n");
}
balance -= valueW;
numWithdrawals++;
if(balance < 0) {
System.out.print("ERROR: Transaction declined!! This transaction will cause overdraft or zero balance\n");
balance += valueW;
} else if(balance <= 25 && active) {
System.out.print("Your balance is less than minimum balance. Your account is now INACTIVE\n");
active = false;
}
if(numWithdrawals > 4) {
balance --;
System.out.print("You have exceeded monthly limit of withdrawals. Fee of $1 charged\n");
}
}
catch (java.util.InputMismatchException e) {
keyboard.nextLine();
}
}
public void totalBalance() {
System.out.printf("Your Balance is: %.2f\n", balance);
}
public void calcInterest() {
double monRate = annualRate / 12;
double monInt = balance * monRate;
balance += monInt;
}
public void monthlyProcess() {
calcInterest();
balance -= monthlyServCharg;
numWithdrawals = 0;
numDeposits = 0;
monthlyServCharg = 0;
System.out.printf("Your Balance after Monthly process is: %.2f\n", balance);
}
public void exit() {
totalBalance();
System.out.print("Thank you. Bye");
}
}

Interest calculator not displaying results

I'm trying to finish this at the last minute for my Java class, when I run the program after it asks the user if the information is correct, it just loops back to the first question no matter what. Here's the code:
import java.util.Scanner;
public class InterestCalculator {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String userResponse = null;
do {
int quartersDisplayed = -1;
double startingBalance = -1,
interestRate = -1;
do {
System.out.println("Enter the numbers of quarters you wish to display that is greater than zero and less or equal to 10: ");
userResponse = input.next();
try{
quartersDisplayed = Integer.parseInt(userResponse);
} catch(NumberFormatException e) {
}
if(quartersDisplayed <= 0 || quartersDisplayed > 10) {
System.out.println("Sorry, that value is not valid.");
} else {
break;
}
} while(true);
do {
System.out.println("Enter the starting balance (must be greater than zero): ");
userResponse = input.next();
try {
startingBalance = Double.parseDouble(userResponse);
} catch(NumberFormatException e) {
}
if(startingBalance <= 0) {
System.out.println("Sorry, that value is not valid.");
} else {
break;
}
} while(true);
do {
System.out.println("Enter the interest rate (greater than zero less than twenty percent): ");
userResponse = input.next();
try {
interestRate = Double.parseDouble(userResponse);
} catch(NumberFormatException e) {
}
if(interestRate <= 0 || interestRate > 20){
System.out.println("Sorry, that value is not valid.");
} else {
break;
}
} while(true);
System.out.println("You have entered the following amount of quarters: "
+ quartersDisplayed);
System.out.println("You also entered the starting balance of: " + startingBalance);
System.out.println("Finally, you entered the following of interest rate: "
+ interestRate);
System.out.println("If this information is not correct, please exit the program and enter the correct information.");
double quarterlyEndingBalance = startingBalance + (startingBalance * interestRate / 100 * .25);
System.out.println("Your ending balance for your quarters is "
+ quarterlyEndingBalance);
System.out.println("Do you want to continue?");
userResponse = input.next();
if("y".equalsIgnoreCase(userResponse) || "yes".equalsIgnoreCase(userResponse))
continue;
else
break;
} while(true);
}
}
What I am looking for as a sample output:
Enter number of quarters from 1 to 10
5
Enter the beginning principal balance greater than zero
4500
Enter the interest rate percentage without the percent sign, greater than 0 percent and less than/equal to 20%
3.5
You entered a principal balance of $4500.0 for 5 quarters at 3.5% interest.
Is this correct? (y/n)
y
Quarter Beginning Interest Ending
Number Balance Earned Balance
1 4500.00 39.38 4539.38
ect ect
Maybe what you ment to do is to restart the loop, if the input was wrong. In this case, you just need to switch the continue and the break.
The continue statement makes a loop immediately start the next iteration. You shoud either remove it by an empty statement ;, or negate the if-condition, remove the else and make it break on true. In addition, your code does nothing else, then getting the input and asking whether it is correct. And as it is written inside a do...while(true) loop, this loop will never end. So either remove that loop, or add an option to abort the process.
Your code should look something like the one below...
**Look out to the bottom, where the user is informed of the values entered and check for the changes made**. This is quite simple...
import java.util.Scanner;
public class correctstack{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String userResponse = null;
do {
int quartersDisplayed = -1;
double startingBalance = -1,
interestRate = -1;
do {
System.out.println("Enter the numbers of quarters you wish to display that is greater than zero and less or equal to 10: ");
userResponse = input.next();
try{
quartersDisplayed = Integer.parseInt(userResponse);
} catch(NumberFormatException e) {
}
if(quartersDisplayed <= 0 || quartersDisplayed > 10) {
System.out.println("Sorry, that value is not valid.");
} else {
break;
}
} while(true);
do {
System.out.println("Enter the starting balance (must be greater than zero): ");
userResponse = input.next();
try {
startingBalance = Double.parseDouble(userResponse);
} catch(NumberFormatException e) {
}
if(startingBalance <= 0) {
System.out.println("Sorry, that value is not valid.");
} else {
break;
}
} while(true);
do {
System.out.println("Enter the interest rate (greater than zero less than twenty percent): ");
userResponse = input.next();
try {
interestRate = Double.parseDouble(userResponse);
} catch(NumberFormatException e) {
}
if(interestRate <= 0 || interestRate > 20){
System.out.println("Sorry, that value is not valid.");
} else {
break;
}
} while(true);
System.out.println("You have entered the following amount of quarters: "+ quartersDisplayed);
System.out.println("You also entered the starting balance of: " + startingBalance);
System.out.println("Finally, you entered the following of interest rate: "+ interestRate);
System.out.println("If this information is not correct, please exit the program and enter the correct information.");
//Here, you give the user the opportunity to continue or re-enter the values. So you go like...
System.out.println("Is this info correct?");
String user_input = input.next();
if("y".equalsIgnoreCase(user_input) || "yes".equalsIgnoreCase(user_input)){
double quarterlyEndingBalance = startingBalance + (startingBalance * interestRate / 100 * .25);
System.out.println("Your ending balance for your quarters is "+ quarterlyEndingBalance);
System.out.println("\n\nDo you want to continue?");
userResponse = input.next();
if("y".equalsIgnoreCase(userResponse) || "yes".equalsIgnoreCase(userResponse))
continue;
else
break;
}
else
continue;
} while(true);
}
}

Arrays and bank accounts in Java

I am trying to write a simple Bank Account Management program that does the following:
Creates a new account with Account number and Balance taken from user and stored in an array
Selects an account (from the array)
Deletes the account selected
Withdraw and Deposit into account selected.
Problem: I don't understand what the my mistakes are.
I tried using different types of arrays for account number and balance storing, but I didn't not find the answer yet. I search the web and Stackoverflow for references, documentations, simple examples, but could not find any (the ones that I found, use some commands and things that I haven't learned yet so I can understand how they work). I am a beginner, I am still learning and would appreciate some advice. Thanks!
//Bank account class
public class account {
private int ANumber;
private double balance;
public account(double initialBalance, int accno) {
balance = initialBalance;
ANumber = accno;
}
public void deposit (double u_amm){
balance += u_amm;
}
public double withdraw(double amount) {
balance -= amount;
return amount;
}
public double getBalance() {
return balance;
}
public int getAccount(){
return ANumber;
}
}
And this is the Main class
import java.util.Scanner;
// main class
public class bankmain {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// Menu starts from here
Scanner input = new Scanner(System.in);
System.out.println("Enter the option for the operation you need:");
System.out.println("****************************************************");
System.out.println("[ Options: ne - New Account de - Delete Account ]");
System.out.println("[ dp - Deposit wi - Withdraw ]");
System.out.println("[ se - Select Account ex - Quit ]");
System.out.println("****************************************************");
System.out.print("> "); //indicator for user input
String choice = input.next();
//Options
while(true){
if(choice == "ne"){
int nacc;
int bal;
int [][]array = new int[nacc][bal]; // Array for account and balance
System.out.print("Insert account number: ");
nacc =input.nextInt(); //-- Input nr for array insertion
System.out.print("Enter initial balance: ");
bal=input.nextInt(); //-- Input nr for array insertion
System.out.println("Current account: " + nacc + " " + "Balance " + bal);
break;
}
// account selection
if(choice.equals("se")){
System.out.println("Enter number of account to be selected: ");
//user input for account nr from array
System.out.println("Account closed.");
}
//close account
if(choice.equals("de")){
//array selected for closing
System.out.println("Account closed.");
}
// deposit
if(choice.equals("dp")){
System.out.print("Enter amount to deposit: ");
double amount = scan.nextDouble();
if(amount <= 0){
System.out.println("You must deposit an amount greater than 0.");
} else {
System.out.println("You have deposited " + (amount + account.getBalance()));
}
}
// withdrawal
if(choice.equals("wi")){
System.out.print("Enter amount to be withdrawn: ");
double amount = scan.nextDouble();
if (amount > account.balance()){
System.out.println("You can't withdraw that amount!");
} else if (amount <= account.balance()) {
account.withdraw(amount);
System.out.println("NewBalance = " + account.getBalance());
}
}
//quit
if(choice == "ex"){
System.exit(0);
}
} // end of menu loop
}// end of main
} // end of class
Your code was wrong on many levels - first try to work on your formatting and naming conventions so you don't learn bad habbits. Dont use small leters for naming classes, try to use full words to describe variables and fields, like in that Account.class example:
public class Account {
private Integer accountNumber;
private Double balance;
public Account(final Integer accountNumber, final Double initialBalance) {
this.accountNumber = accountNumber;
balance = initialBalance;
}
public Double deposit (double depositAmmount) {
balance += depositAmmount;
return balance;
}
public Double withdraw(double withdrawAmmount) {
balance -= withdrawAmmount;
return balance;
}
public Double getBalance() {
return balance;
}
public Integer getAccountNumber() {
return accountNumber;
}
}
Also try to use the same formatting(ie. spaces after brackets) in all code, so that it's simpler for you to read.
Now - what was wrong in your app:
Define the proper holder for your accounts i.e. HashMap that will hold the information about all accounts and will be able to find them by accountNumber.
HashMap<Integer, Account> accountMap = new HashMap<Integer, Account>();
This one should be inside your while loop, as you want your user to do multiple tasks. You could ommit the println's but then the user would have to go back to the top of the screen to see the options.
System.out.println("Enter the option for the operation you need:");
System.out.println("****************************************************");
System.out.println("[ Options: ne - New Account de - Delete Account ]");
System.out.println("[ dp - Deposit wi - Withdraw ]");
System.out.println("[ se - Select Account ex - Quit ]");
System.out.println("****************************************************");
System.out.print("> "); //indicator for user input
String choice = input.nextLine();
System.out.println("Your choice: " + choice);
You shouldn't compare Strings using '==' operator as it may not return expected value. Take a look at: How do I compare strings in Java? or What is the difference between == vs equals() in Java?. For safty use Objects equals instead, ie:
choice.equals("ne")
There was no place where you created the account:
Account newAccount = new Account(newAccountNumber, initialBalance);
You didn't use if-else, just if's. It should look more like that (why to check if the choice is 'wi' if it was already found to be 'ne'):
if(choice.equals("ne")) {
//doStuff
} else if choice.equals("se") {
//doStuff
} //and so on.
If your using Java version >= 7 then instead of if-else you can use switch to compare Strings.
There was no notification of the wrong option:
} else {
System.out.println("Wrong option chosen.");
}
You didn't close your Scanner object. This really doesn't matter here, as it's in main method and will close with it, but it's a matter of good habbits to always close your streams, data sources etc when done using it:
input.close();
So the whole code can look like this:
import java.util.HashMap;
import java.util.Scanner;
// main class
public class BankAccount {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
HashMap<Integer, Account> accountMap = new HashMap<Integer, Account>();
//Options
while(true) {
System.out.println("Enter the option for the operation you need:");
System.out.println("****************************************************");
System.out.println("[ Options: ne - New Account de - Delete Account ]");
System.out.println("[ dp - Deposit wi - Withdraw ]");
System.out.println("[ se - Select Account ex - Quit ]");
System.out.println("****************************************************");
System.out.print("> "); //indicator for user input
String choice = input.next();
System.out.println("Your choice: " + choice);
if(choice.equals("ne")) {
Integer newAccountNumber;
Double initialBalance;
Account newAccount;
// Array for account and balance
System.out.print("Insert account number: ");
newAccountNumber = input.nextInt(); //-- Input nr for array insertion
System.out.print("Enter initial balance: ");
initialBalance=input.nextDouble(); //-- Input nr for array insertion
newAccount = new Account(newAccountNumber, initialBalance);
accountMap.put(newAccountNumber, newAccount);
System.out.println("New Account " + newAccountNumber + " created with balance: " + initialBalance);
}
//select account
else if(choice.equals("se")) {
System.out.println("Enter number of account to be selected: ");
Integer accountToGetNumber = input.nextInt();
Account returnedAccount = accountMap.get(accountToGetNumber);
if (returnedAccount != null)
{
System.out.println("Account open. Current balance: " + returnedAccount.getBalance());
}
else
{
//user input for account nr from array
System.out.println("Account does not exist.");
}
}
//close account
else if(choice.equals("de"))
{
System.out.println("Enter number of account to be selected: ");
Integer accountToDeleteNumber = input.nextInt();
Account removedAccount = accountMap.remove(accountToDeleteNumber);
if (removedAccount != null)
{
System.out.println("Account " + removedAccount.getAccountNumber() + " has been closed with balance: " + removedAccount.getBalance());
}
else
{
//user input for account nr from array
System.out.println("Account does not exist.");
}
}
// deposit
else if(choice.equals("dp")) {
System.out.println("Enter number of account to deposit: ");
Integer accountToDeposit = input.nextInt();
System.out.print("Enter amount to deposit: ");
double amount = input.nextDouble();
if(amount <= 0){
System.out.println("You must deposit an amount greater than 0.");
} else {
accountMap.get(accountToDeposit).deposit(amount);
System.out.println("You have deposited " + (amount));
System.out.println("Current balance " + accountMap.get(accountToDeposit).getBalance());
}
}
// withdrawal
else if(choice.equals("wi")) {
System.out.println("Enter number of account to withdraw: ");
Integer accountToWithdraw = input.nextInt();
System.out.print("Enter amount to withdraw: ");
double amount = input.nextDouble();
if(amount <= 0) {
System.out.println("You must deposit an amount greater than 0.");
} else {
accountMap.get(accountToWithdraw).withdraw(amount);
System.out.println("You have deposited " + (amount));
System.out.println("Current balance " + accountMap.get(accountToWithdraw).getBalance());
}
}
//quit
else if(choice.equals("ex")) {
break;
} else {
System.out.println("Wrong option.");
} //end of if
} //end of loop
input.close();
} //end of main
} //end of class
There still is much to improve, i.e. input validation - but this should work for the begining.
You have written the above code, but it has many mistakes. You need to learn the The basics of Java programming.
I have modified your program to perform below operations :-
Create new account.
Select existing account.
Deposit amount.
Withdraw amount.
View balance.
Delete account.
Exit.
Account.java :
/**
* This class performs bank operations
*/
public class Account {
private int accNumber;
private double balance;
public Account(double initialBalance, int accNo) {
balance = initialBalance;
accNumber = accNo;
}
public void deposit(double amount) {
balance += amount;
}
public double withdraw(double amount) {
balance -= amount;
return amount;
}
public double getBalance() {
return balance;
}
public int getAccNumber() {
return accNumber;
}
}
BankMain.java :
public class BankMain {
private static double amount;
private static ArrayList<Account> accountList = new ArrayList<>();
private static Account selectedAccount;
private static boolean flag = false;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// Menu starts from here
Scanner input = new Scanner(System.in);
System.out.println("Enter the option for the operation you need:");
System.out
.println("****************************************************");
System.out
.println("[ Options: new - New Account del - Delete Account ]");
System.out
.println("[ dp - Deposit wi - Withdraw bal - Check balance ]");
System.out
.println("[ se - Select Account exit - Quit ]");
System.out
.println("****************************************************");
Account account = null;
while (true) {
System.out.println("> "); // indicator for user input
String choice = input.next();
// Options
switch (choice) {
case "new":
// Create new account
int accNo = 0;
int bal = 0;
System.out.println("Enter account number : ");
accNo = input.nextInt();
System.out.println("Enter initial balance: ");
bal = input.nextInt();
System.out.println("Current account: " + accNo + " "
+ "Balance " + bal);
account = new Account(bal, accNo);
accountList.add(account);
break;
case "se":
// select account
System.out
.println("Enter account number for further operations : ");
int selectedAcc = scan.nextInt();
System.out.println("Selected account : " + selectedAcc);
for (Object object : accountList) {
selectedAccount = (Account) object;
if (selectedAccount.getAccNumber() == selectedAcc) {
flag = true;
break;
} else {
flag = false;
}
}
if (!flag) {
System.out.println("Account doesn't exists.");
}
if (accountList.size() == 0) {
System.out.println("Zero account exists.");
}
break;
case "del":
// close account
System.out
.println("Enter account number for further operations : ");
int selectedAcc1 = scan.nextInt();
System.out.println("Selected account : " + selectedAcc1);
Iterator<Account> iterator = accountList.iterator();
while (iterator.hasNext()) {
selectedAccount = (Account) iterator.next();
if (selectedAccount.getAccNumber() == selectedAcc1) {
iterator.remove();
flag = true;
break;
}
}
if (!flag) {
System.out.println("Account doesn't exists.");
}
System.out.println("Account " + selectedAcc1 + " closed.");
break;
case "dp":
// Deposit amount
System.out.println("Enter amount to deposit : ");
amount = scan.nextDouble();
if (amount <= 0) {
System.out
.println("You must deposit an amount greater than 0.");
} else {
if (flag) {
selectedAccount.deposit(amount);
System.out.println("You have deposited " + amount
+ ". Total balance : "
+ (selectedAccount.getBalance()));
} else {
System.out.println("Please select account number.");
}
}
break;
case "wi":
// Withdraw amount
System.out.println("Enter amount to be withdrawn: ");
amount = scan.nextDouble();
if (amount > account.getBalance() && amount <= 0) {
System.out.println("You can't withdraw that amount!");
} else if (amount <= selectedAccount.getBalance()) {
if (flag) {
selectedAccount.withdraw(amount);
System.out.println("You have withdraw : " + amount
+ " NewBalance : "
+ selectedAccount.getBalance());
} else {
System.out.println("Please select account number.");
}
}
break;
case "bal":
// check balance in selected account
if (flag) {
System.out.println("Your current account balance : "
+ selectedAccount.getBalance());
} else {
System.out.println("Please select account number.");
}
break;
case "exit":
default:
// quit
System.out.println("Thank You. Visit Again!");
flag = false;
input.close();
scan.close();
System.exit(0);
break;
}
} // end of menu loop
}// end of main
} // end of class
I have tested this code & it is working fine.
Output :
Enter the option for the operation you need:
****************************************************
[ Options: new - New Account del - Delete Account ]
[ dp - Deposit wi - Withdraw bal - Check balance ]
[ se - Select Account exit - Quit ]
****************************************************
> new
Enter account number : 101
Enter initial balance: 10000
Current account: 101 Balance 10000
> new
Enter account number : 102
Enter initial balance: 25000
Current account: 102 Balance 25000
> se
Enter account number for further operations : 103
Selected account : 103
Account doesn't exists.
> se
Enter account number for further operations : 101
Selected account : 101
> bal
Your current account balance : 10000.0
> dp
Enter amount to deposit : 2500
You have deposited 2500.0. Total balance : 12500.0
> wi
Enter amount to be withdrawn: 500
You have withdraw : 500.0 NewBalance : 12000.0
> se
Enter account number for further operations : 102
Selected account : 102
> bal
Your current account balance : 25000.0
> del
Enter account number for further operations : 101
Selected account : 101
Account 101 closed.
> se
Enter account number for further operations : 101
Selected account : 101
Account doesn't exists.
> exit
Thank You. Visit Again!

Categories

Resources