Permalänk

Java try catch felinmatning

Halloj!
Jag håller i skolan på att bygga en liten enkel kalkylator och det sista jag ska göra är att om jag skriver in en bokstav eller tecken istället för en siffra när den ber om ett tal ska den skicka ett felmedelande och låta användaren skriva in talet igen. Hur gör jag detta? Har förstökt med allt utom det sättet som funkar :'( så hur ska jag göra? och ni för gärna lägga in det i koden så jag verkligen förstår!
Tack på förhand

Programmet:

import java.util.Scanner; import javax.swing.JOptionPane; public class Calculator { public static void main(String[] args) { // TODO Auto-generated method stub //Deklarerar nästan alla variabler double tal1 = 0; double tal2 = 0; double svar = 0; boolean go = true; //Startar en loop som fråg början är evig while(go==true) { //Välkommnar användaren och säger hur denna ska göra System.out.print("\nVälkommen till Unknow12's räknare.\n Välj räknesätt genom att skriva * + - / eller ^\n"); //Läser av inputad variabel Scanner input0 = new Scanner(System.in); char satt=input0.next().charAt(0); //Väljer if beroende på vilket alternativ användaren matade in. Siffrorna är assi kod if(satt == 43){ //Säger åt användaren vad denna ska göra System.out.print("Du har valt Addition \nVar vänlig skriv ett valfritt tal X (X+Y)\n"); //Scannar in talet Scanner input2 = new Scanner(System.in); tal1 = input2.nextDouble(); System.out.print("\nVar vänlig skriv ett valfritt tal Y (X+Y)\n"); //Tar emot nästa tal Scanner input3 = new Scanner(System.in); tal2 = input3.nextDouble(); //Räknar svar = tal1 + tal2; //Berättar svaret System.out.println("Ditt X+Y blev "+svar); } //Denna fungerar på samma sätt som den ovanstående och de under förutom att det är annat räknesätt if(satt == 45){ System.out.print("Du har valt Subration \nVar vänlig skriv ett valfritt tal X (X-Y)\n"); Scanner input4 = new Scanner(System.in); tal1 = input4.nextDouble(); System.out.print("\nVar vänlig skriv ett valfritt tal Y (X-Y)\n"); Scanner input5 = new Scanner(System.in); tal2 = input5.nextDouble(); svar = tal1 - tal2; System.out.println("Ditt X-Y blev "+svar); } if(satt == 47){ System.out.print("Du har valt Divition \nVar vänlig skriv ett valfritt tal X (X/Y)\n"); Scanner input6 = new Scanner(System.in); tal1 = input6.nextDouble(); System.out.print("\nVar vänlig skriv ett valfritt tal Y (X/Y)\n"); Scanner input7 = new Scanner(System.in); tal2 = input7.nextDouble(); svar = tal1 / tal2; //Om svaret är så stort att det inte rymms i en double eller om man får ett oändligt tal genom att t.ex. dividera med noll ska den visa felmedelande if(svar > 999999999){ System.out.println("Något gick fel. Dividerade du med noll?"); } System.out.println("Ditt X/Y blev "+svar); } if(satt == 42){ System.out.print("Du har valt Multiplikation \nVar vänlig skriv ett valfritt tal X (X*Y)\n"); Scanner input8 = new Scanner(System.in); tal1 = input8.nextDouble(); System.out.print("\nVar vänlig skriv ett valfritt tal Y (X*Y)\n"); Scanner input9 = new Scanner(System.in); tal2 = input9.nextDouble(); svar = tal1 * tal2; System.out.println("Ditt X*Y blev "+svar); } if(satt == 94){ System.out.print("Du har valt Upphöjt till \nVar vänlig skriv ett valfritt tal X (X^Y)\n"); Scanner input10 = new Scanner(System.in); tal1 = input10.nextDouble(); System.out.print("\nVar vänlig skriv ett valfritt tal Y (X^Y)\n"); Scanner input11 = new Scanner(System.in); tal2 = input11.nextDouble(); //Upphöjt med svar = Math.pow(tal1, tal2); System.out.println("Ditt X^Y blev "+svar); } //Om användaren i början matar in något annat än vad man får så ska den... if(satt != 43 && satt != 45 && satt != 47 && satt != 42 && satt != 94){ System.out.println("Något gick fel var vänlig försök igen"); } //Frågar användaren om loopen ska startas om eller brytas System.out.println("Vill du börja om? (y/n)"); Scanner input12 = new Scanner(System.in); char bo=input12.next().charAt(0); //Om användaren matar in no bryter den loopen if(bo == 110) { //Bryter loopen go = false; //Hejdåar användaren så att denna blir glad System.out.println("Hejdå!"); } } } }

Visa signatur

i7-4770k OC @ 4,501 Ghz
Asus Geforce GTX 1070 Strix Gaming OC @ 1900 Mhz
16 gb Corsair Vengeance Pro OC @ CL9 2133 Mhz
Samsung SSD 840 OC @ Secret Mhz ;)
Blev på något konstigt vis en mac ägare efter 15 år med windows🤔

Permalänk

@unknown12: Har du något exempel på det du har försökt med så kan jag kanske förklara mer hur du ska göra så att du kan förstå varför man gör som man gör

Permalänk

Fick veta av läraren att vi inte behövde lära oss detta förrän slutet av året och anledningen till att det var på uppgiften var för att det finns vissa som är duktiga och de måste ha en utmaning men tack för hjälpen

Visa signatur

i7-4770k OC @ 4,501 Ghz
Asus Geforce GTX 1070 Strix Gaming OC @ 1900 Mhz
16 gb Corsair Vengeance Pro OC @ CL9 2133 Mhz
Samsung SSD 840 OC @ Secret Mhz ;)
Blev på något konstigt vis en mac ägare efter 15 år med windows🤔

Permalänk
Medlem
Skrivet av unknown12:

Fick veta av läraren att vi inte behövde lära oss detta förrän slutet av året och anledningen till att det var på uppgiften var för att det finns vissa som är duktiga och de måste ha en utmaning men tack för hjälpen

För framtiden så kan du kolla lite på denna länk, man kan använda scanner för att kolla vilken typ av data det är.

http://stackoverflow.com/questions/3059333/validating-input-u...
-----------------------------
hasNext() - does it have any token at all?
hasNextLine() - does it have another line of input?
For Java primitives
hasNextInt() - does it have a token that can be parsed into an int?
Also available are hasNextDouble(), hasNextFloat(), hasNextByte(), hasNextShort(), hasNextLong(), and hasNextBoolean()
As bonus, there's also hasNextBigInteger() and hasNextBigDecimal()
The integral types also has overloads to specify radix (for e.g. hexadecimal)
Regular expression-based
hasNext(String pattern)
hasNext(Pattern pattern) is the Pattern.compile overload
-----------------------------

Visa signatur

/M

Permalänk
Keeper of Traditions
Skrivet av unknown12:

Fick veta av läraren att vi inte behövde lära oss detta förrän slutet av året och anledningen till att det var på uppgiften var för att det finns vissa som är duktiga och de måste ha en utmaning men tack för hjälpen

Det är en ganska enkel uppgift, så försök vara en av "de där duktiga" studenterna som löser uppgiften!

Med try/catch-block kan du fånga felen och försöka lösa det medan programmet körs, istället för att allt bara kraschar. Så kör koden som kan krascha i try-blocket, och lägg sen koden där du hanterar felet i catch-blocket.

Typ,

try{ scanner.readInt() } catch(Exception e1){ println("Kan bara acceptera tal"); //ta hand om felet här }

EDIT: Jag ser även att du skapar 12 skanners som du sen aldrig stänger, en fet minnesläcka
Du behöver bara skapa en, som du sen återanvänder. Sen när programmet stängs ner, så städar du undan den med destroy() (eller motsvarande).

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.