TransWikia.com

¿Por qué falla el código usando la estructura condicional if pero usando la estructura de control switch no falla?

Stack Overflow en español Asked by brettbust on August 27, 2021

El programa consiste en una cuenta bancaria. el cual muestro a continuación:

package com.company;

import java.util.Scanner;

public class Main {

    public static boolean changeBalance(Account account, Operation operation, Long sum) {
       
        if (operation == Operation.DEPOSIT) {
            account.balance += sum;
            return true;

        } else if (operation == Operation.WITHDRAW) {
              if (account.balance < sum) {
                  System.out.println("Not enough money to withdraw.");
                  return false;
            } else {
                  account.balance -= sum;
                  return true;
            }
        }
    }
 //comento el switch el cual si funciona correctamente

/* switch (operation) {
        case DEPOSIT:
            account.balance += sum;
            return true;
        case WITHDRAW:
            if (account.balance < sum) {
                System.out.println("Not enough money to withdraw.");
                return false;
            } else {
                account.balance -= sum;
                return true;
            }
        default:
            return false;
    }
}*/

    enum Operation {
 
        DEPOSIT,
   
        WITHDRAW
    }

    static class Account {

        private String code;
        private Long balance;

        public String getCode() {
            return code;
        }

        public Long getBalance() {
            return balance;
        }

        public void setBalance(Long balance) {
            this.balance = balance;
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String[] parts = scanner.nextLine().split("\s+");

        Account account = new Account();
        account.setBalance(Long.parseLong(parts[0]));

        Operation operation = Operation.valueOf(parts[1]);

        Long sum = Long.parseLong(parts[2]);

        if (changeBalance(account, operation, sum)) {
            System.out.println(account.getBalance());
        }
}
}

Este programa me arroja un error usando el if:

"missing return statement"

En cambio cuando utilizo en lugar del if el switch (el cual coloque en este ejemplo como un comentario) el programa no arroja ningún error y funciona correctamente, pero utilice las mismas instrucciones tanto para uno como para el otro. no entiendo cual es la diferencia o como se puede solucionar este error usando el if.

2 Answers

Fácil, tu función siempre tiene que retornar un valor booleano en su ejecución:

 switch (operation) {
    case DEPOSIT:
        account.balance += sum;
        return true;
    case WITHDRAW:
        if (account.balance < sum) {
            System.out.println("Not enough money to withdraw.");
            return false;
        } else {
            account.balance -= sum;
            return true;
        }
    default:
        return false;
}

tanto en el caso "Deposit" o "WITHDRAW" devuelve un boolean en caso que no sea ni "Deposit" , ni "WITHDRAW" devuelve false ahora si miras tu condiconal if te vas a dar cuenta que :

 if (operation == Operation.DEPOSIT) {
        account.balance += sum;
        return true;

    } else if (operation == Operation.WITHDRAW) {
          if (account.balance < sum) {
              System.out.println("Not enough money to withdraw.");
              return false;
        } else {
              account.balance -= sum;
              return true;
        }
    }

falta un caso para que tenga el mismo comportamiento que el switch, que es el caso ni DEPOSIT ni WITHDRAW :

 if (operation == Operation.DEPOSIT) {
        account.balance += sum;
        return true;

    } else if (operation == Operation.WITHDRAW) {
          if (account.balance < sum) {
              System.out.println("Not enough money to withdraw.");
              return false;
        } else {
              account.balance -= sum;
              return true;
        }
    }

solo debes agregar un return al final del metodo :

public static boolean changeBalance(Account account, Operation operation, Long sum) {
   
    if (operation == Operation.DEPOSIT) {
        account.balance += sum;
        return true;

    } else if (operation == Operation.WITHDRAW) {
          if (account.balance < sum) {
              System.out.println("Not enough money to withdraw.");
              return false;
        } else {
              account.balance -= sum;
              return true;
        }
    }
    return false;
}

Correct answer by altoqueperro on August 27, 2021

Ya la respuesta fue dada por @altoqueperro, pero me gustaría proponer un enfoque con un solo return.

public static boolean changeBalance(Account account, Operation operation, Long sum) {
    
    //Declarar una variable resultado
    boolean resultado = false;

    if (operation == Operation.DEPOSIT) {
        account.balance += sum;
        resultado = true;

    } else if (operation == Operation.WITHDRAW) {
        if (account.balance < sum) {
              System.out.println("Not enough money to withdraw.");
              // aquí no hace falta asignar el resultado porque ya es false
        } else {
              account.balance -= sum;
              resultado = true;
        }
    }
    return resultado;
}

Answered by Pablo Gutiérrez on August 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP