windows - JAVA: Runtime Exception (jeg synes det er, hvad jeg skal bruge)

Indlæg af Hanne Mølgaard Plasc

Problem



Ok, jeg har brug for mit program til at validere bruger indtastede data. Hvis disse data er ugyldige, skal programmet springe næsten hele min kode og komme til slutningen af ​​mit øjebliks loop for at spørge om brugeren gerne vil fortsætte med at beregne et andet lån. Min professor har ikke givet os en metode til at gøre dette, og al den information, jeg har fundet på internettet, er ikke specifik nok til at hjælpe mig. Endnu en gang har jeg brug for koden, efter at valideringen er hoppet over uden at gå ud af programmet og gå til slutningen af ​​sløjfen, hvor jeg spørger brugeren, hvis de vil beregne et andet lån. Her er min kode hidtil.


        /*  This program is an extension of the previous Interest Calculator.  The only different is this one can
    compute not only simple interest but daily and monthly compound interest using a switch statement to
    differentiate each type of interest.    */

import javax.swing.*;
// Import the GUI methods
public class InterestCalculatorLoop {
    public static void main(String[] args) {
    // Entry point of program
        String again = "yes";
        while (again.equalsIgnoreCase("yes" ))
        {
            String option = JOptionPane.showInputDialog("Which type of loan would you like to find interest for? 
1 = Simple Interest 
2 = Monthly Compounded Interest 
3 = Daily Compounded Interest");
            int optionInt = Integer.parseInt(option);
            int interestType = Integer.parseInt(option);
            String paString = JOptionPane.showInputDialog("Enter the principal amount");
            double pa = Double.parseDouble(paString);
            double interest = 0;
            double months = 0;
            double totalInterest = 0;
            double years = 0;
            final double daysInYear = 365.0;
            final double daysInMonth = 30.41666666667;
            final double monthsInYear = 12.0;

            // Logic statements to validate user input or otherwise run through the rest of the program without calculation
            if (pa <= 0)
            {
                JOptionPane.showMessageDialog(null, "Data Error: The principal amount must be greater than zero.  You entered " + pa);
                return;
            }
            else
            {
                String interestString = JOptionPane.showInputDialog("Enter The Annual Interest Rate [1 - 100 percent]) ");
                interest = Double.parseDouble(interestString);
            }
                if (interest < 0 || interest > 100)
                {
                    JOptionPane.showMessageDialog(null, "Data Error: The interest amount must be between 1 and 100. You entered " + interest);
                    return;
                }
                else
                {
                    String monthsString = JOptionPane.showInputDialog("Enter the number of months");
                    months = Double.parseDouble(monthsString);
                }
                    if (months <= 0)
                    {
                        JOptionPane.showMessageDialog(null, "Data Error: The number of months must be above 0.  You entered " + months);
                        return;
                    }
                    else
                    {
                        switch (optionInt)
                        {
                        // Case for simple intrest
                        case 1: optionInt = 1;
                            months = months/monthsInYear;
                            totalInterest = pa * (interest/100.0) * months;
                            JOptionPane.showMessageDialog(null, "The total amount of interest of your loan is $" + totalInterest + ".");
                            break;

                        // Case for monthly compounded interest
                        case 2: optionInt = 2;
                            interest = interest/100.0;
                            years = months/monthsInYear;
                            double exponent = months*years;
                            double interestOverMonths = 1+interest/months;
                            double thirdTotal = Math.pow(interestOverMonths, exponent);
                            double secondTotal = pa*thirdTotal;
                            totalInterest = secondTotal - pa;
                            JOptionPane.showMessageDialog(null, "The total amount of interest of your loan is $" + totalInterest + ".");
                            break;

                        // Case for daily compounded interest
                        case 3: optionInt = 3;
                            interest = interest/100.0;
                            double days = months*daysInMonth;
                            years = days/daysInYear;
                            exponent = days*years;
                            double interestOverDays = 1+interest/days;
                            thirdTotal = Math.pow(interestOverDays, exponent);
                            secondTotal = pa*thirdTotal;
                            totalInterest = secondTotal - pa;
                            JOptionPane.showMessageDialog(null, "The total amount of interest of your loan is $" + totalInterest + ".");
                            break;
                        }
                    }
                    again = JOptionPane.showInputDialog("Would you like to compute another loan? (yes or no)");

        }

    }
}

Bedste reference


Break er meget nyttigt til at stoppe sløjfer som du sagde, du ønskede. Det har væsentlig betydning, at den boolske parameter for en for-loop sættes til sand.


Du kan selvfølgelig bruge hvad i CMD henvises til en GOTO. du kan skabe noget som:


top:
for(int i = 0; i < 10; i++){
  if(i == 9){
    break top;
  }
}

Andre referencer 1


Jeg har skummet gennem din kode og for at være ærlig, ved jeg ikke meget om lån og de beregninger der er forbundet med det.


Som du stadig klart lærer det grundlæggende, ville en simpel løsning ved udseendet af det være at tage ud:


while (again.equalsIgnoreCase("yes" ))
{

    /*
     * FROM HERE
     */
    String option = JOptionPane.showInputDialog("Which type of loan would you like to find interest for? 
1 = Simple Interest 
2 = Monthly Compounded Interest 
3 = Daily Compounded Interest");
    int optionInt = Integer.parseInt(option);

    //...

    /*
    *  TO HERE
    */
    again = JOptionPane.showInputDialog("Would you like to compute another loan? (yes or no)");

}


Og sæt det i sin egen metode kaldes for eksempel:


public static void askAndProcessDetails()


Så når du return går du til gentagelsesdialogen.


while (again.equalsIgnoreCase("yes" ))
{
    askAndProcessDetails();
    again = JOptionPane.showInputDialog("Would you like to compute another loan? (yes or no)");
}

Andre referencer 2


Fortsæt er måske et af de værste træk ved java, med break-søgeordet (undtagen i switch statements). Det fører til puslespil kode, hvor du skal finde ud af, hvor koden hopper. Man fortsætter kan være praktisk, men det bliver meget svært at ændre den kode, den producerer (tænk på at tilføje en indre sløjfe ..), og 2 fortsætter vil gøre dig skør.


Du kan altid undgå at bruge fortsæt, der er altid en anden løsning. Samme for pause.


Her, hvorfor bruger du bare en slags


if( answerIsValid ) {
  //process it
  ...
}//if


Det er nemt, enkelt, klart og endnu bedre, når du har en separat metode, der indeholder behandling.


Også i dit tilfælde, der er bundet til robusthed, kan du give en proces () metode, der kaster en undtagelse, hvis de indtastede data ikke er gyldige. Dette gør det endnu mere klart, at der er en 'normal' programadfærd og en masse mærkelige tilfælde, du håndterer som fejl.


public void processAnswer( String stringAnswer ) throws ArithmeticException {
   int answer = Integer.parseInt( stringAnswer );
     //rest of processing
     ...
}//met


så bliver din hovedløkke


    String again = "yes";
    while (again.equalsIgnoreCase("yes" ))
    {
       String stringAnswer = JOptionPane...
       try {
         process( stringAnswer );
       } catch( ArithmeticException ex ) {
        JOptionPane.showMessageDialog( "This is not an integer !" );
       }//catch
    }//while