Att skriva till och läsa från terminalfönstret Oftast används grafiska komponenter i Java för att kommunicera med användaren (användargränssnitt), men det finns objekt i standardbiblioteken för de tillfällen när man vill kunna göra utskrifter i terminalfönstret och läsa in uppgifter från användaren genom tangentbordet. Att skriva till När du skrev programmet HelloWorld använde du objektet System.out och anropade metoden println( ) på det objektet. System.out.println ( Hello World! ) ; Om du istället vill skriva ut en sträng skickar du in den som parameter till metoden: String minstrang = new String ( Hello Pelle! ) ; System.out.println ( minstrang ) ; Man kan skriva ut flera olika strängar tillsammans genom att skriva plustecken (+) mellan varje enskild sträng. System.out.println ( minstrang + dinstrang + Hej då! ) ; Med metoden println( ) läggs en radbrytning automatiskt till. Om du vill skriva ut utan att samtidigt få med radbrytningen kan du istället anropa metoden print( ) System.out.print ( minstrang ) ; och läsa från För att läsa från tangentbordet används flera objekt, bl.a. objektet System.in. Nedan ges ett exempel på att läsa in en hel rad från tangentbordet med metoden readline( ) ( en hel rad innebär tills ett radbrytningstecken hittas. Mellanslag kan alltså också läsas in med detta metodanrop. ) Eftersom att flera objekt är inblandade och koden för att läsa in blir lång brukar man deklarera rad 8 en gång för att sedan anropa metoden readline( ) på samma objekt varje gång man vill läsa in något från tangentbordet.
//Exempel 1 1. import java.io.* 2. public class NameReader 3. { 4. public static void ( String[ ] args ) throws IOException 5. { 6. String name ; 7. 8. BufferedReader in = new BufferedReader ( new InputStreamReader( System.in ) ) ; 9. 10. System.out.print ( What is your name? ); 11. 12. name = in.readline(); 13. 14. System.out.println( Hello + name); 15. } 16. } På rad 6 deklareras strängen name, ett objekt av typen String som kommer att användas för att lagra texten som vi läser in från tangentbordet. På rad 12 läser vi från tangentbordet med ett anrop till metoden readline( ) i objektet in. Den inlästa textsträngen (inklusive mellanslag, om sådana finns) tilldelas name. På rad 14 skriver vi ut texten som lästes in direkt efter en annan textsträng. Plustecknet (+) sätter samman flera textsträngar. Observera att på rad 4, direkt efter metodhuvudet, har jag skrivit throws IOException. Läs mer om undantag och hur du hanterar dessa nedan. att läsa in heltal För att läsa in heltal krävs det att man omvandlar strängen som man läser in med BufferedReader till en int. Detta kan göras med hjälp av metoden parseint() i klassen Integer. Eftersom att metoden parseint är en statisk metod behöver du inte skapa något objekt av Integer för att använda metoden. Det räcker med att skriva klassnamnet framför metodanropet. Se exemplet nedan.
//Exempel 2 1. import java.io.*; 2. class lasafrantgb{ 3. public static void main(string [] args) throws IOException { 4. int tal = 0; 5. boolean lastal = true; 6. BufferedReader in=new BufferedReader (new InputStreamReader(System.in)); 7. System.out.print("ange ett tal: "); 8. while( lastal ) { 9. String s=in.readline(); 10. try { 11. tal=integer.parseint(s); 12. lastal = false; 13. } catch (NumberFormatException e) { 14. System.out.print ( "Det var fel! Ange ett tal: "); 15. } 16. } 17. System.out.println("talet var "+tal); 18. } 19. } Om du går in i Javas API och tittar på metoden parseint (se även textrutan nedan) ser du att den kommer att kasta ett undantag om texten som inte skrevs in var ett heltal. Genom att fånga undantaget (på rad 13) och göra en felutskrift (rad 14) kan du uppmana användaren att hålla sig till heltal i fortsättningen. While-loopen använder en primitiv typ boolean för att fortsätta be om ett heltal. Variabeln lastal kommer att få värdet false om ett undantag inte kastas (annars går exekveringen förbi den raden, ner till catch på rad 13) och loopen avbryts. Om vi inte tilldelar tal=0 i början av programmet kommer kompileringen varna för att variablen kanske inte är initierad när den används på rad 17. Läs mer om hur du fångar undantag i stycket nedan.
parseint public static int parseint(string s) throws NumberFormatException Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign '-' ('\u002d') to indicate a negative value. The resulting integer value is returned, exactly as if the argument and the radix 10 were given as arguments to the parseint(java.lang.string, int) method. Parameters: s - a String containing the int representation to be parsed Returns: the integer value represented by the argument in decimal. Throws: NumberFormatException - if the string does not contain a parsable integer. Undantag Metoden readline( ) kastar ett undantag av typen IOException om något går fel vid läsning från tangentbordet. Om du anropar en metod som kastar ett undantag måste du hantera det på något sätt. Ett sätt är att fånga undantaget och försöka åtgärda problemet som orsakade det. Ett annat sätt är att deklarera att er egen metod kastar undantaget vidare. Om du inte gör någonting får du ett felmeddelande under kompileringen: NameReader.java:13: unreported exception java.io.ioexception; must be caught or declared to be thrown name = in.readline(); 1 error Men hur vet du att en viss metod kastar undantag? Och hur vet du vilken typ som kastas? Titta på dokumentationen för readline i Java API (klicka er dit via java.io/bufferedreader/ readline)
readline public String readline() throws IOException Read a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed. Returns: A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached Throws: IOException - If an I/O error occurs Som du ser har metoden samma slags deklaration av undantag som jag skrev i exemplet ovan. När du anropar en metod kan du se i Java API om metoden kastar ett undantag och också vilken typ av undantag den kastar (IOException är ett objekt, precis som, nästan, allting annat i Java och därmed också av en viss typ.) Jämför gärna med andra metoder i Java API. I Exempel 1 deklarerar vi att vår metod kan komma att kasta ett undantag. Deklarationen sker i metodhuvudet på rad 4. Om ett undantag kastas kommer detta att fångas upp av systemet som avbryter programmet. I Exempel 2 fångar vi undantaget som eventuellt kastas. Undantaget kastas av metoden parseint på rad 11 och fångas av catch-satsen på rad 17. All eventuell kod som finns efter metoden och innan catch-satsen kommer inte att exekveras. Det innebär att den boolska variabeln lastal inte kommer att ändra värde till false om undantaget kastas. När felmeddelandet i catch-satsen har skrivits ut kommer koden att fortsätta exekvera efter catchsatsen och loopen kommer att fortsätta och läser in användarens val. Kompilera och prova programmet själv. Vi kommer att diskutera undantagshantering mer i senare moduler.