Gå til innhold

Trøbbel med feilhåndtering og løkke


Anbefalte innlegg

Har en funksjon som ser så her ut:

/**Reads an int from the keyboard. Does not give up before it has got a valid integer.
 * 
 * @return An integer that is read from the keyboard
 */
public static int readIntFromKeyboard () {
 Scanner keyboard = new Scanner(System.in);
 int readInt = -1;
 boolean ready;
 do {
 	ready = true;
 	try {
   readInt = keyboard.nextInt();
 	}
 	catch (InputMismatchException foo) {
   System.out.println("Please enter a numeral");
   ready = false;
 	}
 	finally {
   
 	}
 } while (!ready);
 
 return readInt;
}

 

Hva den gjør burde være selvforklarende, men det er ett problem - hvis brukeren ikke taster inn ett tall, så skjer dette (evig løkke):

 

*** DEBUG MENU ***
1.   Generate and print a random deck
101. Exit debugmenu (continue normal program execution)
102. Exit debugmenu (exit program)
r
Please enter a numeral
Please enter a numeral
Please enter a numeral
Please enter a numeral
Please enter a numeral
Please enter a numeral
...

 

Det skjer ikke ut til at den prøver på nytt med try {} - hvorfor ikke? Hvordan kan jeg få den til å gjøre dette?

 

EDIT:Tittel. Gammel tittel: "Trøbbel med feilhåndtering og løkke". Tenkte det var likegreit å samle maset mitt i en lang tråd, stort sett "opplagt" syntaxtull og manglende erfaring som blokkerer uansett...

Endret av kyrsjo
Lenke til kommentar
Videoannonse
Annonse

Wild guess: keyboard.nextInt() fjerner ikke ting fra inputstreamen dersom det den ikke får ikke er en integer. Dermed blir det samme liggende hele tiden. Prøv å flushe inputstreamen på en eller annen måte.

 

Disclaimer: Har ikke programmert Java på årevis

 

Edit:

"If the translation is successful, the scanner advances past the input that matched. "

 

Dermed kan man annta at dersom translation ikke var successful, så 'avanserer' den ikke forbi, men blir hengende.

Endret av JBlack
Lenke til kommentar
Wild guess: keyboard.nextInt() fjerner ikke ting fra inputstreamen dersom det den ikke får ikke er en integer. Dermed blir det samme liggende hele tiden. Prøv å flushe inputstreamen på en eller annen måte.

 

Disclaimer: Har ikke programmert Java på årevis

 

Edit:

"If the translation is successful, the scanner advances past the input that matched. "

 

Dermed kan man annta at dersom translation ikke var successful, så 'avanserer' den ikke forbi, men blir hengende.

5284526[/snapback]

 

Ah. Lese dokumentasjonen er en finfin ting. Problemet var at jeg ikke ante hvor jeg skulle starte - har aldri brukt hverken scanner eller try/catch før...

 

*lese*

 

EDIT: Ble ikke så veldig mye klokere. Stod noe om posisjon til peker, men denne var ikke implementert (var ment for at subklasser skulle implementerer den).

 

Urk.

 

Menmen. prosjektet ruller videre! Er forøvrig en kaballøser - et program som finner alle mulige trær av trekk for en kabal, og regner ut litt statistikk. Først skal jeg få den til å løse en (tilfeldig generert) kabal, og så skal man gå igjennom alle 52! kabalene.

 

Lukter distribuert prosjekt laaaang vei...

Endret av kyrsjo
Lenke til kommentar

Har ikke brukt scanner-klassen før, men tror dette gjør susen:

 

  public static int readIntFromKeyboard () {
     Scanner keyboard = new Scanner(System.in);
     int readInt = -1;
     boolean ready;
     do {
        ready = true;
        try {
           readInt = keyboard.nextInt();
        }
        catch (InputMismatchException foo) {
           System.out.println("Please enter a numeral");
           ready = false;
           keyboard.next(); // Tømmer scanneren hvis det ikke var en int
        }
        finally {

        }
        } while (!ready);

        return readInt;
    }

 

Du får ha lykke til med de 52! permutasjonene da :thumbup:

Lenke til kommentar
Har ikke brukt scanner-klassen før, men tror dette gjør susen:

 

  public static int readIntFromKeyboard () {
     Scanner keyboard = new Scanner(System.in);
     int readInt = -1;
     boolean ready;
     do {
        ready = true;
        try {
           readInt = keyboard.nextInt();
        }
        catch (InputMismatchException foo) {
           System.out.println("Please enter a numeral");
           ready = false;
           keyboard.next(); // Tømmer scanneren hvis det ikke var en int
        }
        finally {

        }
        } while (!ready);

        return readInt;
    }

 

Du får ha lykke til med de 52! permutasjonene da  :thumbup:

5286795[/snapback]

 

Woho! Det funka :w00t: Takk!

 

Nå lurer jeg på en ny ting: Jeg ønsker å lage en array av ArrayLists! Dette burde jo gå... Så jeg tenkte å gjøre noe ala:

ArrayList[] <Card> lowerRows = new ArrayList [7] <Card> ();

 

Problemet er bare at jeg får syntaxerror herifra til månen...

Lenke til kommentar
Nå lurer jeg på en ny ting: Jeg ønsker å lage en array av ArrayLists! Dette burde jo gå... Så jeg tenkte å gjøre noe ala:

ArrayList[] <Card> lowerRows = new ArrayList [7] <Card> ();

 

Problemet er bare at jeg får syntaxerror herifra til månen...

5287319[/snapback]

 

Prøv dette:

ArrayList<Card> lowerRows[] = new ArrayList[7];

for (int i=0; i<7; i++)
 lowerRows[i] = new ArrayList<Card>();

 

Det gir en unchecked/unsafe advarsel ved kompilering, men jeg vet ikke om noen måte å gjøre dette som ikke gir noen advarsel (med mindre du vil droppe å bruke generics).

 

Edit: hadde rotet litt

Endret av yonderboy
Lenke til kommentar

Hakket meg rund det ved å opprette en klasse, slik:

/**Hack in order to be able to create an array of ArrayLists, and still keep type safety.
* 
* @author Kyrre Ness Sjøbæk
*
*/
class CardHolder {
public ArrayList <Card> heldCards = new ArrayList <Card> ();
}

 

Er ikke dette strengt tatt en bug i Java - at man ikke kan lage arrays av typesafe ArrayLists? Gjelder vel da sannsynligvis for HashMaps's også, og evt. andre typesafe "holdeklasser"... Får ta å teste at det ikke bare er eclipse sin compiler som loker, og evt. rapportere bug i fanget til Sun/IBM.

Lenke til kommentar
Er ikke dette strengt tatt en bug i Java - at man ikke kan lage arrays av typesafe ArrayLists? Gjelder vel da sannsynligvis for HashMaps's også, og evt. andre typesafe "holdeklasser"... Får ta å teste at det ikke bare er eclipse sin compiler som loker, og evt. rapportere bug i fanget til Sun/IBM.

 

Det er nok ikke en bug - se den "offisielle" generics-tutorialen (http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf, avsnitt 7.3 side 15):

 

The component type of an array object may not be a type variable or a parameterized type, unless it is an (unbounded) wildcard type.You can declare array types whose element type is a type variable or a parameterized type, but not array objects.

 

 

Det er også noen oppklarende diskusjoner på forum.java.sun om emnet:

 

http://forum.java.sun.com/thread.jspa?thre...30823&tstart=75

http://forum.java.sun.com/thread.jspa?foru...threadID=564355

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...