Программа на Java

Модератор: Модераторы разделов

Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Программа на Java

Сообщение T.D. »

Сразу хочу сказать, что это всего-лишь моя вторая программа на Java. Так что прошу сильно не ругаться. :)

Вот отрывок из программы:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "Cp866"));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out, "Cp866"), true);
pw.println("Введите фигуры:");
do
{
s = br.readLine();
StringTokenizer str = new StringTokenizer(s);
st = str.nextToken();
if(st == "R")
{
......


Коротко поясню.
Вводится последовательность строк типа: "R 100 100 100 100 255/0/0"
Затем эту строчку я разбиваю на слова (пробел выступает в роли разделителя).
В переменную st я помещаю первое слово (в данном случае "R"). Оно действительно туда помещается (проверял, вставив pw.println(st); перед if-ом).
Но когда st сравнивается с "R", то получается, что st != "R" (т.к. операторы в if-е не выполняются).
Подскажите, в чем м.б. проблема?
Может потому что я указываю в качестве кодировки "Cp866"?

И еще один вопрос, возникший у меня в программе: Как значение, хранящееся в переменной типа String, преобразовать к числовому типу (желательно к целому)?

Заранее благодарен за помощь.
Спасибо сказали:
neuralNetwork
Сообщения: 119
ОС: Debian Squeeze

Re: Программа на Java

Сообщение neuralNetwork »

T.D. писал(а):
30.10.2005 00:00
Но когда st сравнивается с "R", то получается, что st != "R"

У Вас сравниваются не строки, а объектные ссылки. Поэтому st != "R". Правильно строки сравнивать так:

Код: Выделить всё

st.equals("R")


T.D. писал(а):
30.10.2005 00:00
И еще один вопрос, возникший у меня в программе: Как значение, хранящееся в переменной типа String, преобразовать к числовому типу (желательно к целому)?

Код: Выделить всё

Integer.parseInt(st)
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

to Neuron:
Большое спасибо. Щас все проверю. :)
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

То, что Вы подсказали помогло. За это огромное спасибо. :)
Но возникла еще одна проблема: :(
public static void main (String[] args)
{
R[] r_array = new R[5];
..................
try
{
Здесь код, который я привел выше.
if(st.equals("R"))
{
r_array[r].Nomer = i+1;
r_array[r].x1 = Integer.parseInt(str.nextToken());
r_array[r].y1 = Integer.parseInt(str.nextToken());
r_array[r].x2 = Integer.parseInt(str.nextToken());
r_array[r].y2 = Integer.parseInt(str.nextToken());
r_array[r].color = str.nextToken();
i++;
r++;
}
......................

Программа запускается, но после ввода строки выскакивает ошибка:
java.lang.NullPointerException
Ошибка где-то в if-е, но где?
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Программа на Java

Сообщение Jan2ary »

А полный стек? Обычно номер строки выводит.

Похоже что элементы массива r_array не инициализированы. И еще перед взятием нового токена хорошо бы проверять на наличие такового с hasMoreToken().
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

А полный стек? Обычно номер строки выводит.

Если Вы насчет ошибки, то после ввода первой строки выводится сообщение
java.lang.NullPointerException
После этого Java просит нажать любую клавишу для выхода (ну это как после завершения программы).
Похоже что элементы массива r_array не инициализированы.

А как они инициализируются? Может конструктор создать и что в нем должно быть?
И еще перед взятием нового токена хорошо бы проверять на наличие такового с hasMoreToken().

Щас проверю. Хотя вроде точно расчитал их колличество. ;)
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Программа на Java

Сообщение Jan2ary »

По поводу стека:
Покажи catch. обычно для информативности делают так

Код: Выделить всё

try{
...
}catch (Exception e){
System.out.println(e.getMessage()); // можно в System.err
e.printStackTrace();
}

О количестве аргументов: а вдруг тебе захочется изменить количество или даже принцип передачи данных программе? А если их 100 будет? Всегда проще использовать конструкцию типа

Код: Выделить всё

while(str.hasMoreToken()){
str.nextToken();
}
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
NorthDragon
Сообщения: 62
ОС: ArchLinux

Re: Программа на Java

Сообщение NorthDragon »

R[] r_array = new R[5];
Программа запускается, но после ввода строки выскакивает ошибка:
java.lang.NullPointerException
Ошибка где-то в if-е, но где?


Инструкцией new Вы выделили место под пять ссылок на обьект класса R.
Эти ссылки равны null
перед обращении по ссылке необходимо создать сам обьект т.е

Код: Выделить всё

R[0] = new R();
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Программа на Java

Сообщение Jan2ary »

Ну вот. Я его подталкивал...
Ну ничего, надеюсь, T.D. любознательности хватит ;)
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

На счет Token-ов я проверил - там все нормально.
А насчет R[0] = new R(); спасибо. Теперь буду знать. :)

P.S. Создание объекта лучше делать в конструкторе?
Т.е. написать вот так:
for(int i = 0;i <= 5;i++)
R[i] = new R();

Я правильно думаю?
Если да, то конструктор нужно создавать с параметрами или нет? Если без параметров (R()), то при вызове в конструкторе R[i] = new R() он будет вызывать конструктор R() (т.е. сам себя)?
Или можно обойтись без своего конструктора (использовать тот, что по умолчанию)? Если да, то объект нужно создавать до того, как я выделил место под пять ссылок или можно после?

Всем огромное спасибо за помощь. :)
У очень нелегко разбираться с Java, не имея полноценной книги под рукой. :)
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

Разобрался. :D
Оказывается в If-е первым оператором надо было поставить
r_array[r] = new R();
И никакого конструктора не потребовалось. Хватило того, который по умолчанию. :)

Еще раз всем большое спасибо. :D
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Программа на Java

Сообщение Jan2ary »

:) Человечище растет!

А книжку лучше заиметь. Например, "Философия Java" Эккеля, рекомендую.
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

Человечище растет!

Спасибо. Стараюсь разобраться. :)

Но вот возник еще один вопросик. Если кто поможет, буду очень благодарен.
Возможно ли в Java рисовать в консоли? (это все таже программа)
Т. е. от меня требуется следующее:
1) С клавиатуры вводится последовательность геом. фигур в виде строк вида "R x1 y1 x2 y2 color".
2) Необходимо нарисовать эти фигуры.

С первой частью я разобрался с Вашей помощью.
А вот со второй пока не очень. Т. е. я нашел во всякого рода эл-ой литер-ре, как можно рисовать в окне (использование Frame), а вот как нарисовать нигде не могу найти. Вот и возникает вопрос, а это вообще возможно?
Если возможно, то какие модули надо подключать и какие классы в них использовать?
Пробовал с Graphics, но никак не получилось создать объект этого класса (постоянно ругается, что Graphics- это абстрактный класс).

P.S. А может у кого есть код программы, которая рисует в консоли (или в которой используется Graphics)? Желательно что-нибудь попроще, а то пробовал разобраться с примерами , идущими с jdk, но что-то не очень у меня это получилось.

Заранее спасибо за помощь.
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

Ну неужели никто не вкурсе? :(
Подскажите хотя бы как создать объект класса Graphics, так чтобы не ругался на абстрактность этого класса.
А может кто знает ссылку на то, где об этом можно почитать?
Действительно очень нужно.
Заранее спасибо.
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

Сам во всем разобрался. :D
Спасибо, что заставили меня самому до всего докопаться. :)
А книгу действительно надо бы прикупить.
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Программа на Java

Сообщение Jan2ary »

Последнего сообщения не заметил, нашел ссылку... Не пропадать же :)
http://www.ictp.trieste.it/~manuals/progra...wingShapes.html
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

Последнего сообщения не заметил, нашел ссылку... Не пропадать же
http://www.ictp.trieste.it/~manuals/progra...wingShapes.html

Спасибо. Возьму на заметку. :)
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

Занялся пересечением прямоугольников, но что-то никак не могу въехать.
Есть такой метод
public static void intersect (Rectangle2D rect1, Rectangle2D rect2, Rectangle2D rect3)
Насколько я понял, он пересекает прямоугольники rect1 и rect2, а результат записывает в rect3.
Но я никак не могу понять как его использовать. Дело в том, что он вызывается от объекта класса Rectangle2D.
Например так:
Rectangle2D rect;
rect.intersect (rect1, rect2, rect3);
Так вот я немогу понять, от какого именно объекта нужно вызывать этот метод.
Что из себя должен представлять объект rect? Вместо него должен быть rect1 или rect2 или rect3 или это абсолютно без разницы?

Прошу объясните мне механизм работы этого метода и от какого объекта его нужно вызывать.

Заранее спасибо.
Спасибо сказали:
neuralNetwork
Сообщения: 119
ОС: Debian Squeeze

Re: Программа на Java

Сообщение neuralNetwork »

Метод является статическим, т. е. обращение к нему может происходить (и, вообще говоря, происходит) без ссылки на конкретный объект класса. В этом случае вместо ссылки при вызове указывается просто имя класса:

Код: Выделить всё

Rectangle2D.intersect(rect1, rect2, rect3);
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

Спасибо, но видимо еще до этого у меня возникает ошибка. :(
public class Rectangls extends Applet
{

..............

Rectangle2D rect1;
..............

public boolean action(Event e, Object arg)
{
if(e.target == result_button)
{
.........Задаются x1,y1,w1,h1.............

rect1.setRect(x1,y1,w1,h1);

.................................

Ошибка возникает еще при задании прямоугольника rect1.setRect(x1,y1,w1,h1);
Проверял следующим способом:
g.drawString("Первая",400,100);
rect1.setRect(x1,y1,w1,h1);
g.drawString("Вторая",400,200);

Первая строка выводится, а вторая уже нет.

Может быть этого определения Rectangle2D rect1; недостаточно ?
Может нужно как-нибудь еще проинициализировать rect1?

Если кто знает вчем тут дело, подскажите.
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Программа на Java

Сообщение Jan2ary »

А что за ошибка? Наверное, NullPointerException?

Если да, то снова проблема в инициализации, вот так:

Rectangle2D rect1 = new Rectangle2D();
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
neuralNetwork
Сообщения: 119
ОС: Debian Squeeze

Re: Программа на Java

Сообщение neuralNetwork »

Rectangle2D - абстрактный класс, поэтому его экземпляры создавать нельзя.

2T.D. В Вашем случае, наверное, надо создавать экземпляр класса Rectangle - наследника Rectangle2D:

Код: Выделить всё

rect1 = new Rectangle(x1, y1, w1, h1);

P.S. Помните, что в Java, в отличие от C++, конструкция вида

Код: Выделить всё

MyClass myObj;

создает только ссылку на объект класса, а не сам объект! Все объекты должны создаваться с помощью операции new!
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

Спасибо всем. :)
Щас буду разбираться.
P.S. Помните, что в Java, в отличие от C++, конструкция вида
MyClass myObj;

создает только ссылку на объект класса, а не сам объект! Все объекты должны создаваться с помощью операции new!

Действительно, никак не могу привыкнуть. :)
Постоянно в этом косяки возникают.
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Программа на Java

Сообщение T.D. »

Огромное всем спасибо!!! :D
Все заработало. Чтобы я вообще без вас делал? :)
Спасибо сказали: