Permalänk

Java Try catch Nybörjare Hjälp

Hej, (testar igen med rätt kod-taggar)

jag vill testa på lite Java och läser därför en extrakurs, inledande programmering. I senaste uppgiften lyckas jag inte applicera en felkontroll korrekt.

Meningen är att en användare ska mata in ett jämnt antal heltal och avsluta med q och då ska programmet hoppa vidare till nästa steg. Om man matar in en bokstav/decimaltal och trycker enter så ska programmet ignorera detta och låta användaren skriva in heltal. Om man matar in "bokstav(eller decimaltal)" 2 "bokstav(eller decimaltal)" 4 q så ska programmet ignorera bokstäverna och bara läsa in heltalen och gå vidare till nästa steg.

Jag har försökt flera olika try catch och do while men lyckas aldrig helt. Koden nedan ignorerar om användaren råkar skriva "bokstav" 2 4 q och gör uträkningen men går inte vidare till nästa steg.
Programmet kraschar om man matar in 2 "bokstav" 4.
Och matar man bara in en siffra så ignorerar programmet det men användaren kan inte mata in nya heltal.
Koden under den kan läsa in 2 4 q och går vidare i programmet men kraschar vid inmatning av bokstäver trots ett försök till try catch.

Jag förstår att ingen ska lös problemet åt mig, men är jag på väg åt rätt håll? Har jag försökt applicera try catch rätt? Jag har läst i boken och kolla tutorials men får inte till det..
Tacksam för en puff i rätt riktning!

(om någon variabel inte används så hänger den kvar från mina tester)

import java.io.*; import java.util.InputMismatchException; import java.util.Scanner; public class TEESST { static Scanner scan= new Scanner(System.in); //Deklarerar globala variabler static int divider; public static void main(String[] args) { //Deklarerar variabler int radius=0, height=0; float baseSurface; //Ber användaren om inmatning System.out.println("# Test av areametoderna "); System.out.print(">"); System.out.println(); do { if (scan.hasNextInt())//Anger villkor { //Läser in angivna värden radius= scan.nextInt(); height=scan.nextInt(); //Omvandlar negativa tal till positiva vid behov if (radius<0 || height<0) { radius = Math.abs(radius); height = Math.abs(height); } //Skriver ut radie och höjd System.out.print("r = "+ radius+ " "); System.out.println("h = "+ height); //Anropar metoder för att beräknar basyta baseSurface = area((int) radius); //Skriver ut basyta System.out.printf("Basytans area: " + "%.2f", baseSurface); System.out.println(); }//Avslutar while else { reply = scan.next(); } } while (reply != "q"); if (reply.equals("q"))//Anger villkor för att gå vidare till bråktal { //Ber användaren om inmatning System.out.println("# Test av bråktalsmetoderna "); //Mer kod som inte behövs för detta exempel } }//Avslutar main-metoden //Beräknar basytans area public static float area(int rad) { float baseLocal = 0; baseLocal = (float) (Math.PI*rad*rad); return baseLocal; } }//Avslutar class-metoden

NY KOD som inte kan hantera bokstäver trots Try catch

import java.io.*; import java.util.InputMismatchException; import java.util.Scanner; public class TEST { static Scanner scan= new Scanner(System.in); //Deklarerar globala variabler static int divider; public static void main(String[] args) { //Deklarerar variabler int radius=0, height=0; float baseSurface; //Ber användaren om inmatning System.out.println("# Test av areametoderna och volymmetoderna "); System.out.print(">"); System.out.println(); try { while (scan.hasNextInt())//Anger villkor { //Läser in angivna värden radius= scan.nextInt(); height=scan.nextInt(); //Omvandlar negativa tal till positiva vid behov if (radius<0 || height<0) { radius = Math.abs(radius); height = Math.abs(height); } //Skriver ut radie och höjd System.out.print("r = "+ radius+ " "); System.out.println("h = "+ height); //Anropar metoder för att beräknar basyta, envelopeSurface och volym baseSurface = area((int) radius); //Skriver ut basyta System.out.printf("Basytans area: " + "%.2f", baseSurface); System.out.println(); }//Avslutar while reply = scan.next(); } catch(InputMismatchException e) { System.out.println("igen2"); } catch(Exception e){ System.out.println("igen"); } if (reply.equals("q"))//Anger villkor för att gå vidare till bråktal { //Ber användaren om inmatning System.out.println("# Test av bråktalsmetoderna "); //plus massa kod som inte behövs för denna fråga } }//Avslutar main-metoden //Beräknar basytans area public static float area(int rad) { float baseLocal = 0; baseLocal = (float) (Math.PI*rad*rad); return baseLocal; } }//Avslutar class-metoden

Permalänk

Code-taggar använder [ code ], inte <code>.

Har inte läst igenom hela koden eftersom code-taggarna inte fungerar, men såvitt jag kan se så hanterar du inte Scannern på rätt sätt. Scanner.nextInt hämtar bara värden om det som matats in är en valid int, annars står den bara still. Dessutom så har du i ditt Try-block endast testen Scanner.hasNextInt, som inte kan kasta en exception utan bara returnera ett boolvärde.

Sättet jag hade löst det här på är att inte använda Scanner.nextInt utan själv hantera konverteringen String -> int

Scanner sc = new Scanner(); while (sc.hasNext()) { String s = sc.nextLine(); try { int value = Integer.parseInt(s); System.out.println("Valid number!" + value); } catch (NumberFormatException e) { System.out.println("Not number!"); } }

Permalänk
Medlem

Inte skrivit så mycket java men kan se vart det blir problem.

Mitt tips är att använda debuggern för att se vad hur koden stegar fram alternativt lägga in fler små output meddelanden så du ser vad det är för något din scaner jobbar med för stunden.

Och för try catch för att validera input blir det nog lite grov hugget, du säger försök göra detta om det inte går gör detta istället så den går inte tillbaka in in try om den har fått ett exception.
Hoppas de ger någon liten hint.

Vet inte om allt måste in på en rad men steg ett hade jag gjort så att ja bett om radius och sett till så den var en int sen fråga efter height och validera den för att sedan gå vidare med beräkningarna.

Dold text
Permalänk

@Maldergho: Tack, jag försökte applicera din lösning men det blev inte riktigt det jag behöver ändå. Får testa igen!

Permalänk
Hedersmedlem

Hej!

Skitbra att du hittat till code-taggen. Då har du halva inne för att koden ska bli läsbar här på forumet!

Men det saknas fortfarande indentering. Det gör det jättesvårt att läsa din kod. Du får tänka på att det är minst dubbelt så svårt att läsa kod som att skriva kod, och minst dubbelt så svårt igen att läsa någon annans kod (eller kod man skrivit för mer än en dag sedan), så det är en bra tumregel att göra kod som är så lättläst som möjligt.

Uppskattar om du kan snygga till koden med lite indentering åtminstone så att det går att få ett grepp över strukturen på koden i fråga.

P.S.: En annan bra grej här på forumet: Istället för att göra ett till inlägg, så kan du redigera ditt gamla... det är inte så bra att skapa fler trådar i samma ämne. (Brukar förr eller senare sammanfogas av moderator.)

Permalänk

Är det här en uppgift just för att ni ska lära er try-catch? För det är ett typiskt problem som lättast löses genom att kolla vad för input som fås genom scannern innan man hämtar och där try-catch blir lite overkill. Så jag tycker du bör utveckla din första version.

Try-catch är mer applicerbar där du har något som inte kan styras i förhand och som inte kan kontrolleras innan, exempelvis när skriver/läser från en fil som sporadiskt försvinner eller inte är tillgänglig längre. (Finns bättre exempel men jag har idé torka )

Ett problem som du har är att du i början av varje loop kontrollera om det finns ett heltal, men det kan finnas egentligen vad som helst, så kolla först efter det. Om det finns något så kan du sedan kontrollera om det är ett heltal och i så fall utföra det som ska göras. Men är det inte ett heltal så kan du hämta strängen som finns och kontrollera om den är ditt stop tecken 'q'.

Sedan när du kontrollerar om det finns ett heltal med hasNextInt så läser du in två värden med nextInt, vilket innebär att du vet att det finns ett men hämtar två. Dock så finns det inget som säger att det finns just två heltal efter varandra. Så du bör göra så att den sparar undan det första talet när det kommer och sedan väntar på att nästa ska komma i nästa varv utav loopen eller hantera felet om det inte kommer något heltal.

Tog ut loopen och indenterade den.

do { // Anger villkor if (scan.hasNextInt()) { // Läser in angivna värden radius = scan.nextInt(); height = scan.nextInt(); // Omvandlar negativa tal till positiva vid behov if (radius < 0 || height < 0) { radius = Math.abs(radius); height = Math.abs(height); } // Skriver ut radie och höjd System.out.print("r = " + radius + " "); System.out.println("h = " + height); // Anropar metoder för att beräknar basyta baseSurface = area(radius); // Skriver ut basyta System.out.printf("Basytans area: " + "%.2f", baseSurface); System.out.println(); } else { reply = scan.next(); } } while (reply != "q");

Dold text
Visa signatur

PHOBOS | R7 5700G | RX 7900 XT && ZELOS | Envy x360 | R7 4700U, båda med Fedora Silverblue.

Permalänk
Hedersmedlem

*Trådar sammanfogade*

Jag har sammanfogat dina trådar då vi inte tillåter korspostning. Kom ihåg att det det går bra att antingen anmäla sin egen tråd eller pm:a en moderator om man behöver hjälp

Visa signatur

Danskjävel så krattar som en skrivare...