Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / мистические приключения переменной в классе, реализующем Runnable / 14 сообщений из 14, страница 1 из 1
06.02.2013, 18:06:48
    #38140587
BaurzhanS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
Всем привет.
Выкладываю небольшой кусочек кода, который странно себя ведет.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class SomeClass implements Runnable {

    int tmstmp;

    public SomeClass (int x) { 
                     tmstmp= (int) (System.getCurrentMillis()/1000); 
                     // здесь все нормально, распечатка показывает, что переменная установилась
    } 

    public void run() {
        while (true) {
           try{
                 System.out.println(tmstmp); // выводит то, что получил в конструкторе, все ок.
                 tmstmp+=300000;
                  System.out.println(tmstmp);  // не прибавилось! выводит то же самое, что вывел выше.
                Thread.sleep(5000);
           }catch(Exception ex){ex.toString();}
        }
    }
}



Вопрос - что не так? Удивительно, что похожий пример видел в интернете, спокойно объявляют перменную-поле класса и используют (изменяют в методе run()).
...
Рейтинг: 0 / 0
06.02.2013, 18:11:56
    #38140592
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
BaurzhanS
Код: java
1.
2.
3.
4.
                 
System.out.println(tmstmp); // выводит то, что получил в конструкторе, все ок.
tmstmp+=300000;
System.out.println(tmstmp);  // не прибавилось! выводит то же самое, что вывел выше.



А как вы в логе отличаете эти две строки? Выводите номер перед значением.
BaurzhanS
Код: java
1.
           }catch(Exception ex){ex.toString();}


Новое слово в обработке исключений. toString() что по вашему делает?
...
Рейтинг: 0 / 0
06.02.2013, 18:12:18
    #38140593
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
И приведите полный исполняемый test case.
...
Рейтинг: 0 / 0
06.02.2013, 19:06:55
    #38140662
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
может дело в этом?

public static long currentTimeMillis()


int tmstmp;
...
Рейтинг: 0 / 0
06.02.2013, 19:12:30
    #38140667
BaurzhanS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
Кореецможет дело в этом?

public static long currentTimeMillis()

я же привожу к int

int tmstmp;
...
Рейтинг: 0 / 0
06.02.2013, 19:12:39
    #38140668
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
Кореец,
влазит в инт, еще и место остается
...
Рейтинг: 0 / 0
06.02.2013, 19:16:11
    #38140673
BaurzhanS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
BlazkowiczBaurzhanS
Код: java
1.
2.
3.
4.
                 
System.out.println(tmstmp); // выводит то, что получил в конструкторе, все ок.
tmstmp+=300000;
System.out.println(tmstmp);  // не прибавилось! выводит то же самое, что вывел выше.



А как вы в логе отличаете эти две строки? Выводите номер перед значением.

Если Вы имеете в виду, как я отличаю от других результатов распечатки, то очень просто - больше ничего не вывожу, только эти значения. Хоть цикл и бесконечный, я, увидев такое странное поведение на первой итерации, отрубал программу.
BaurzhanS
Код: java
1.
           }catch(Exception ex){ex.toString();}


Новое слово в обработке исключений. toString() что по вашему делает?
Знаю, что надо писать в логи или хотя бы печатать текст ошибки. Но это был тестовый класс для мелкой вспомогательной работы, мне не важна была обработка исключений.
...
Рейтинг: 0 / 0
06.02.2013, 19:17:10
    #38140674
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
Кореец,

//не заметил деления на 1000, но дело скорей всего в типах.

кстати, тоже вопрос возник. а почему так?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class Test {

	public static void main(String[] args) {
          System.out.println( Integer.parseInt(System.currentTimeMillis()/1000+"") );
          System.out.println( (int) System.currentTimeMillis()/1000 );
          System.out.println( System.currentTimeMillis()/1000 );
	}
}


1360163702
-1340929
1360163702



что происходит с приведением типа по (int) ??
...
Рейтинг: 0 / 0
06.02.2013, 19:21:32
    #38140683
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
Кореец,

все понял

приведение раньше деления выполнялось.
если скобки поставить то все ок.

System.out.println( (int) (System.currentTimeMillis()/1000) );
...
Рейтинг: 0 / 0
06.02.2013, 19:23:20
    #38140687
BaurzhanS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
КореецКореец,

//не заметил деления на 1000, но дело скорей всего в типах.

кстати, тоже вопрос возник. а почему так?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class Test {

	public static void main(String[] args) {
          System.out.println( Integer.parseInt(System.currentTimeMillis()/1000+"") );
          System.out.println( (int) System.currentTimeMillis()/1000 );
          System.out.println( System.currentTimeMillis()/1000 );
	}
}


1360163702
-1340929
1360163702



что происходит с приведением типа по (int) ??
Второй случай с минусом, потому что сперва приводите лонг к инту, а так как метод currentTimeMillis() возвращает число большее чем max_int, происходит переполнение. Ну а потом делится переполненное (отрицательное число) на 1000, опять получается отрицательное число. А в первом и третьем случае никакого переполнения не происходит
...
Рейтинг: 0 / 0
06.02.2013, 19:25:15
    #38140689
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
Кореец,
ничего не происходит. У вас сначала лонг приводится к инту, а потом делится на тыщу. А надо наоборот.
...
Рейтинг: 0 / 0
06.02.2013, 19:28:16
    #38140696
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
BaurzhanS,

у меня ваш пример кстати отработал нормально

1360 1 64445
1360 4 64445
...
Рейтинг: 0 / 0
06.02.2013, 19:29:49
    #38140699
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
javapecker,

сенкс, я это уже понял 13886792 ))
...
Рейтинг: 0 / 0
07.02.2013, 06:44:21
    #38141029
BaurzhanS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мистические приключения переменной в классе, реализующем Runnable
КореецBaurzhanS,

у меня ваш пример кстати отработал нормально

1360 1 64445
1360 4 64445

Блин, я невнимателен. У меня тоже отработало - из-за того, что прибавлял круглую цифру, последние разряды не менялись и я в спешке не обратил внимание на старшие разряды. Всем спасибо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / мистические приключения переменной в классе, реализующем Runnable / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]