Аха, натресъл си се с рогата напред в една от най-неприятните особености на Жабата. Входните операции са голяма проклетия там. Даже се учудих, че изобщо се компилира този код.
Значи, номерът е в това, че в Жабата
няма входни оператори, процедурите по въвеждане на данни се реализират от стандартни класове, които са част от задължителните пакети
java.lang и
System (горе-долу като библиотеките на С++). Обичайно за въвеждане от клавиатурата се използва обект от класа
BufferedReader инициализиран със стандартния входен поток
System.in. Той пък, от своя страна, е обект от клас
InputStreamReader. Зверски засукано, но това е цената, която се плаща за платформената независимост.
Какво ще рече това на практика?
Първо, трябва ни обект от клас
BufferedReader. Да го кръстим, в традицията на С/С++,
stdin и да обявим съответната обектна променлива:
...
BufferedReader stdin;
...
ПонежеBufferedReader (също и InputStreamReader) е дефиниран в пакета java.io, налага се да го импортираме, т.е. в самото начало на програмата декларираме:
import java.io.*;
...
В краят на краищата получаваме следния код:
import java.io.*;
class kordinati {
BufferedReader stdin;
...
stdin = new BufferedReader ( new InputStreamReader ( System.in ) );
...
public static void main (String args [])
...
... |
Може малко да се съкрати, впрочем:
BufferedReader stdin = new BufferedReader ( new InputStreamReader ( System.in ) ); |
Т.е. създаваме обект от клас BufferedReader като го инициализираме с обекта in, предоставен от класа System. Самият in е от тип InputStreamReader.
Вече можем да четем данни от клавиатурата посредством метода readLine();, предоставен от класа BufferedReader (и достъпен чрез променливата stdin):
stdin.readLine();
Циркът, обаче, не свършва до тук. Методът readLine(); винаги връща обект от тип String. Значи, трябва тепърва да го преобразуваме в стойност от тип int. Това става посредством метода parseInt( ), който се съдържа в класа Integer.
Нещо такова:
String input = stdin.readLine();
X = Integer.parseInt( input );
или по-кратко:
X = Integer.parseInt( stdin.readLine() );
(Особено весело е, че ако X беше от тип double, щеше да се наложи да получим стойността по друг начин:
X = Double.valueOf( stdin.readLine() ).doubleValue(); )
Окончателно получаваме следния код:
import java.io.*;
class Kordinati {
BufferedReader stdin;
int X,Y;
Kordinati() throws IOException {
stdin = new BufferedReader ( new InputStreamReader ( System.in ) );
System.out.print("vavedi X=");
X = Integer.parseInt( stdin.readLine() );
System.out.print("vavedi Y=");
Y = Integer.parseInt( stdin.readLine() );
if ( X>0 & Y>0 )
{
System.out.print("X i Y se namirat v parvi kvadrant");
}
else
{
System.out.print("Te sa v drug kvadrant");
}
}
public static void main (String args[]) throws IOException
{
new Kordinati();
}
} |
Забележи, че съм изкарал основната част от програмата извън метода main. Причината е, че той е статичен метод и би трябвало да обявим променливата stdin като "static". Това, обаче, обикновено създава усложнения в работата на обектите от клас BufferedReader. Затова предпочитам да си вържа гащите и да изведа целия ефективен код от main. А в main оставям само създаването на анонимен обект от класа Kordinati - добра практика, която предпазва от неприятни изненади, свързани с употребата на статични променливи, методи и пр.
А тук намерих доста добро изложение на входно-изходните операции в Жабата. В същност огледай се из оня сайт, има доста неща, които може да ти бъдат от полза.