powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ошибки начинающих java-программистов
69 сообщений из 69, показаны все 3 страниц
ошибки начинающих java-программистов
    #33344523
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33345322
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Имя класса отличается от имени файла, в котором он хранится.

Все используемые мною среды java, включая Javasoft JDKs, предполагают,
что исходный код класса с модификатором public хранится в файле с точно
таким же именем, как и имя класса, и расширением .java. Несоблюдение этого
соглашения может стать причиной многих проблем, которые выявятся во время
компиляции.

Начинающие студенты (программисты) часто забывают об этом соглашении,
и, например, задают имя файла в соответствии с заданием: Lab6.java.

Ошибочный пример: Имя файла Lab6.java -
Код: plaintext
1.
2.
3.
4.
5.
6.
 public   class  Airplane  extends  Vehicle
  Seat pilot;
   public  Airplane() { 
    pilot =  new  Seat(); 
  }
}

Исправленный пример: Имя файла Airplane.java -
Код: plaintext
1.
2.
3.
4.
5.
6.
 public   class  Airplane  extends  Vehicle
  Seat pilot;
   public  Airplane() { 
    pilot =  new  Seat(); 
  }
}

Заметьте: предполагается, что имя класса начинается с заглавной буквы. В
операционных системах, которые учитывают регистр символов в именах файлов,
могут появиться дополнительные проблемы, особенно у студентов, изучающих
Java под Unix, и привыкших к системе именования файлов в DOS. Класс
MotorVehicle должен храниться в файле MotorVehicle.java, но не в файле
motorvehicle.java.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33345358
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. Сравнение с помощью ==

В Java строки - это объекты класса java.lang.String. Оператор ==, применяемый
к объектам, проверяет на равенство ссылки на объекты! Иногда студенты не
понимают семантики оператора == и пытаются применить его для сравнения
строк.

Ошибочный пример :
Код: plaintext
1.
2.
3.
4.
// проверим, равен ли первый аргумент "-a"
 if  (args[ 0 ] == "-a") {
    optionsAll = true;
}

Правильный способ сравнения 2х строк на равенство - это использование метода
equals() класса java.lang.String. Он возвращает true, если строки одинаковой
длины и состоят из одних и тех же символов. (Прим. перев.: вообще-то это не
гарантирует равенство. На самом деле, equals проверяет, равны ли посимвольно
2 строки)

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
//  проверим, равен ли первый аргумент "-a"
 if  ("-a".equals(args[ 0 ])) {
    optionsAll = true;
}

Эта ошибка - дурацкая, потому что на самом деле Java код получается
синтаксически правильным, а в итоге работает не так как нужно. Некоторые
студенты также пытаются применять операторы сравнения > и <= , вместо метода compareTo() класса java.lang.String. Эту ошибку обнаружить
проще, потому что она вызывает ошибки на этапе компиляции.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33345416
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3. Забыл проинициализировать объекты, являющиеся элементами массива.

В Java массив объектов - это на самом деле массив ссылок на объекты. Создание
массива - это просто создание набора ссылок, ни на что не указывающих (то
есть равных null ). Чтобы на самом деле создать "полноценный" массив
объектов, необходимо проинициализировать каждый элемент массива. Многие
студенты не понимают этого; они считают, что, создавая массив объектов, они
автоматически создают сами объекты. (В большинстве случаев, студенты
приносят эту концепцию из C++, где создание массива объектов приводит к
созданию самих объектов путем вызова их конструктора по умолчанию).

В примере ниже, студент хочет создать 3 объекта класса StringBuffer. Код
будет откомпилирован без ошибок, но в последней строке произойдет
исключение NullPointerException, где происходит обращение к несуществующему
объекту.

Ошибочный пример :
Код: plaintext
1.
2.
3.
4.
// Создаем массив из StringBuffer
StringBuffer [] myTempBuffers;
myTempBuffers =  new  StringBuffer[ 3 ];
myTempBuffers[ 0 ].add(data);

Чтобы не допускать эту ошибку, необходимо не забывать проинициализировать
элементы массива.

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// Создаем массив из StringBuffer и инициализируем элементы
StringBuffer [] myTempBuffers;
myTempBuffers =  new  StringBuffer[ 3 ];
 for  ( int  ix =  0 ; ix < myTempBuffers.length; ix++) 
     myTempBuffers[ix] =  new  StringBuffer();

myTempBuffers[ 0 ].add(data);
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33345472
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4. Помещение в один файл сразу нескольких классов с модификатором public

Файлы с исходным java-кодом определенным образом связаны с классами,
содержащимися в этих файлах. Связь можно охарактеризовать так:

Любой Java-класс хранится не более чем в одном файле

В любой файл с исходным кодом можно поместить не более 1-го класса с
модификатором public

Если в файле с исходным кодом есть класс с модификатором public , имя
файла и имя класса должны быть строго одинаковыми (прим. перев.: до
регистра, см. п.1)

Иногда студенты забывают о 2-ом правиле, что приводит к ошибкам на этапе
компиляции. Сообщение об ошибке для 2-го и 3-го правила будет одинаковым
(в чем собственно и заключается трудность распознания этой ошибки).
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33345520
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5. Подмена поля класса локальной переменной.

Java позволяет объявлять внутри метода переменные, чье имя совпадает с
полями класса. В таком случае преимущество будет отдано локальным
переменным, и они будут использоваться вместо полей.

Компилятор выдаст ошибку, если переменные с одинаковыми именами будут
разных типов. Если же они одинаковых типов, ошибки компиляции не будет, и
будут непонятны причины неправильной работы программы.

Ошибочный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 public   class  Point3 {
     int  i =  0 ;    
     int  j =  0 ;    
     int  k =  0 ;

     public   boolean  hits(Point[] p2list) {
       for ( int  i =  0 ; i < p2list.length; i++) {
        Point p2 = p2list[i];
         if  (p2.x == i && p2.y == j)
           return  true;
      }
       return  false;
    }
}

Есть несколько способов, как исправить эту ошибку. Наиболее простой -
обращаться к полям класса с помощью неявного указателя this: this.имя_поля.
Более лучший способ - это переименовать поле класса или локальную
переменную, тогда подмены не произойдет. (прим. перев.: 2-ой способ - не
наш метод. К тому же он не гарантирует, что я когда нибудь случайно не
подменю поле переменной. Еще большая трудность возникнет при
наследовании, когда я вообще не вижу, какие поля есть у класса)

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  // One way to fix the problem
   int  i =  0 ;    
   int  j =  0 ;    
   int  k =  0 ;

   public   boolean  hits(Point[] p2list) {
     for ( int  i =  0 ; i < p2list.length; i++) {
      Point p2 = p2list[i];
       if  (p2.x ==  this .i && p2.y ==  this .j)
         return  true;
    }
     return  false;
  }

  // *****************************
  // Более лучший способ
   int  x =  0 ;    
   int  y =  0 ;    
   int  z =  0 ;

   public   boolean  hits(Point[] p2list) {
     for ( int  i =  0 ; i < p2list.length; i++) {
      Point p2 = p2list[i];
       if  (p2.x == x && p2.y == y)
         return  true;
    }
     return  false;
  }

Еще одно возможное место появления этой ошибки - задание имени параметра
метода таким же, как и имя поля класса. Это хорошо выглядит в конструкторах,
но для обычных методов не подходит.

прим. перев.
немного сумбурно, но смысл такой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 public   class  Test {
    private   int  param =  0 ;

    public  Test( int  param) {
       this .param = param;
   }
}
то есть в конструкторе все смотрится красиво, но для обычных методов
применять это не следует.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33345685
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
6. Забыл вызвать конструктор родителя (суперкласса).

Когда класс расширяет другой класс, каждый конструктор подкласса должен
вызвать какой-либо конструктор суперкласса. Обычно это достигается вызовом
конструктора суперкласса методом super(x) , помещенным в первой строке
конструктора. Если в первой строке конвтруктора нет вызова super(x) ,
компилятор самостоятельно вставляет этот вызов, но без параметров: super() .
(прим. перев.: х...се, а я и не знал )

Иногда студенты забывают об этом требовании. Обычно это не является
проблемой: вызов конструктора суперкласса вставляется компилятором и все
работает отлично. Однако если у суперкласса нет конструктора по умолчанию
(прим. перев.: то есть конструктора без параметров), то компилятор выдаст
ошибку. В примере ниже все конструкторы суперкласса java.io.File имеют
1 или 2 параметра:

Ошибочный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
 public   class  JavaClassFile  extends  File {
    String classname;
     public  JavaClassFile(String cl) {
        classname = cl;
    }
}

Решением проблемы является вставка явного вызова правильного
конструктора суперкласса:

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 public   class  JavaClassFile  extends  File {
    String classname;
     public  JavaClassFile(String cl) {
         super (cl + ".class");
        classname = cl;
    }
}

Более неприятная ситуация возникает, когда у суперкласса есть конструктор
по умолчанию, но он не полностью инициализирует объект. В таком случае
код скомпилируется, но результат работы программы может быть
неправильным или может возникнуть исключение.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33345777
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
7. Неправильный перехват исключений

Система обработки исключений в Java достаточно мощная, но трудная для
понимания новичками. Студенты, хорошо владеющие C++ или Ada, обычно не
испытывают сложностей, в отличие от программистов C и Fortran. Примеры ниже
показывают некоторые распространенные ошибки.

В данном примере для исключения не указано имя. На эту ошибку укажет
компилятор на этапе компиляции, так что ее легко исправить самостоятельно.

Ошибочный пример :
Код: plaintext
1.
2.
3.
4.
5.
 try  {
    stream1 =  new  FileInputStream("data.txt");
}  catch  (IOException) { 
    message("Could not open data.txt");
}

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
 try  {
   stream1 =  new  FileInputStream("data.txt");
}  catch  (IOException ie) { 
   message("Could not open data.txt: " + ie);
}


Порядок расположения блоков catch определяет очередность перехвата
исключений. Нужно учитывать, что каждый такой блок перехватит все
исключения указанного класса или любого его подкласса. Если не учесть
это, то можно получить недостижимый блок catch, на что укажет компилятор.
В примере ниже SocketException является подклассом IOException.

Ошибочный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 try  {
    serviceSocket.setSoTimeout( 1000 );
    newsock = serviceSocket.accept();
}  catch  (IOException ie) { 
    message("Error accepting connection.");
}  catch  (SocketException se) {
    message("Error setting time-out.");
}

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 try  {
    serviceSocket.setSoTimeout( 1000 );
    newsock = serviceSocket.accept();
}  catch  (SocketException se) {
    message("Error setting time-out.");
}  catch  (IOException ie) { 
    message("Error accepting connection.");
}


Если в коде возможно появление исключения, которое не перехватавается
ни одним блоком try-catch, то это исключение следует объявить в заголовке
метода. (Для исключений - подклассов класса RuntimeException это не
обязательно). Студенты иногда забывают о том, что вызов метода может
порождать исключение. Проще всего это исправить, помещая вызов метода в
блок try-catch.

Ошибочный пример :
Код: plaintext
1.
2.
3.
 public   void  waitFor( int  sec) {
    Thread.sleep(sec *  1000 );
}

Исправленный пример :
Код: plaintext
1.
2.
3.
 public   void  waitFor( int  sec)  throws  InterruptedException {
    Thread.sleep(sec *  1000 );
}
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33345817
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8. Метод доступа имеет тип void

Это очень простая ошибка. Студент создает метод для доступа к переменной,
но указывает, что метод ничего не возвращает (помещает модификатор void
в загогловок метода). Чтобы исправить эту ошибку, нужно указать правильный
тип возвращаемого значения.

Ошибочный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
 public   class  Line {
     private  Point start, end;
     public   void  getStart() { 
       return  start; 
    }
}

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
 public   class  Line {
     private  Point start, end;
     public  Point getStart() { 
       return  start; 
    }
}

Указание неправильного возвращаемого типа порождает целый класс
ошибок. Обычно компилятор распознает эти ошибки и сообщает о них,
так что студенты могут самостоятельно их исправить.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33345848
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
9. Вызов нестатичных методов класса из метода main()

Входной точкой любой Java программы должен быть статичный метод main :
Код: plaintext
1.
2.
3.
 public   static   void  main(String[] args) {
  ...
}

Так как этот метод статичный, нельзя из него вызывать нестатичные
методы класса. Об этом часто забывают студенты и пытаются вызывать
методы, не создавая экземпляр класса. Эту ошибку обычно допускают в
самом начале обучения, когда студенты пишут маленькие программы.

Ошибочный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 public   class  DivTest {
     boolean  divisible( int  x,  int  y) {
         return  (x % y ==  0 );
    }

     public   static   void  main(String[] args) {
         int  v1 =  14 ;
         int  v2 =  9 ;

        // на следующие строки компилятор выдаст ошибку
         if  (divisible(v1, v2)) {
            System.out.println(v1 + " is a multiple of " + v2);
        }  else  {
            System.out.println(v2 + " does not divide " + v1);
        }
    }
}

Есть 2 способа исправления ошибки: сделать нужный метод статичным
или создать экземпляр класса. Чтобы правильно выбрать нужный способ,
задайте себе вопрос: использует ли метод поля или другие методы класса.
Если да, то следует создать экземпляр класса и вызвать у него метод,
иначе следует сделать метод статичным.

Исправленный пример 1 :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 public   class  DivTest {
     int  modulus;

     public  DivTest( int  m) { 
      modulus = m; 
    }
    
     boolean  divisible( int  x) {
         return  (x % modulus ==  0 );
    }

     public   static   void  main(String[] args) {
         int  v1 =  14 ;
         int  v2 =  9 ;

        DivTest tester =  new  DivTest(v2);

         if  (tester.divisible(v1) {
            System.out.println(v1 + " is a multiple of " + v2);
        }  else  {
            System.out.println(v2 + " does not divide " + v1);
        }
    }
}

Исправленный пример 2 :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public   class  DivTest {
     static   boolean  divisible( int  x,  int  y) {
         return  (x % y ==  0 );
    }

     public   static   void  main(String[] args) {
         int  v1 =  14 ;
         int  v2 =  9 ;

         if  (divisible(v1, v2)) {
            System.out.println(v1 + " is a multiple of " + v2);
        }  else  {
            System.out.println(v2 + " does not divide " + v1);
        }
    }
}
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33347086
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
10. Использование объектов класса String как параметров метода.

В Java класс java.lang.String хранит строковые данные. Однако, строки в Java
(1) обладают постоянством (то есть их нельзя изменять),
(2) являются объектами.

Поэтому с ними нельзя обращаться как просто с буфером символов, это
неизменяемые объекты. Иногда студенты передают строки, ошибочно
расчитывая на то, что строка-объект будет передана как массив символов
по ссылке (как в C или C++). Компилятор обычно не считает это ошибкой.

Ошибочный пример .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public   static   void  main(String args[]) {
   String test1 = "Today is ";
   appendTodaysDate(test1);
   System.out.println(test1);
}

/* прим. редактора: закомментированный метод должен иметь модификатор
    static (здесь автором допущена ошибка №9)
public void appendTodaysDate(String line) {
    line = line + (new Date()).toString();
}
*/

 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

В примере выше студент хочет изменить значение локальной переменной test1,
присваивая новое значение параметру line в методе appendTodaysDate.
Естественно это не сработает. Значение line изменится, но значение test1
останется прежним.

Эта ошибка возникает из-за непонимания того, что (1) java объекты всегда
передаются по ссылке и (2) строки в Java неизменяемы. Нужно осмыслить, что
объекты-строки никогда не изменяют своего значения, а все операции над
строками создают новый объект.

Чтобы исправить ошибку в примере выше, нужно или возвращать строку из
метода, или передавать объект StringBuffer как параметр методу вместо String.

Исправленный пример 1 :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public   static   void  main(String args[]) {
   String test1 = "Today is ";
   test1 = appendTodaysDate(test1);
   System.out.println(test1);
}

 public   static  String appendTodaysDate(String line) {
     return  (line + ( new  Date()).toString());
}

Исправленный пример 2 :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public   static   void  main(String args[]) {
   StringBuffer test1 =  new  StringBuffer("Today is ");
   appendTodaysDate(test1);
   System.out.println(test1.toString());
}

 public   static   void  appendTodaysDate(StringBuffer line) {
    line.append(( new  Date()).toString());
}

прим. перев.вообще-то понять в чем ошибка не так просто.
так как объекты передаются по ссылке, то значит line ссылается туда же,
куда и test1. А значит создавая новый line, мы создаем новый test1.
в неправильном примере все выглядит так, как будто передача String идет
по значению, а не по ссылке.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33347322
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
11. Объявление конструктора как метода

Конструкторы объектов в Java внешне похожы на обычные методы. Единственные
отличия - у конструктора не указывается тип возвращаемого значения и
название совпадает с именем класса. К несчастью, Java допускает задание
имени метода, совпадающего с названием класса.

В примере ниже, студент хочет проинициализировать поле класса Vector list
при создании класса. Этого не произойдет, так как метод 'IntList' - это не
конструктор.

Ошибочный пример .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 public   class  IntList {
    Vector list;

    // Выглядит как конструктор, но на самом деле это метод
     public   void  IntList() {
        list =  new  Vector();
    }

     public  append( int  n) {
        list.addElement( new  Integer(n));
    }
}

Код выдаст исключение NullPointerException при первом же ображении к полю
list. Ошибку легко исправить: нужно просто убрать возвращаемое значение
из заголовка метода.

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 public   class  IntList {
    Vector list;

    // Это конструктор
     public  IntList() {
        list =  new  Vector();
    }

     public  append( int  n) {
        list.addElement( new  Integer(n));
    }
}
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33347364
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12. Забыл привести объект к нужному типу.

Как и во всех других объектно-ориентированных языках, в Java можно
обращаться к объекту как к его суперклассу. Это называется 'upcasting',
он выполняется в Java автоматически. Однако, если переменная, поле
класса или возвращаемое значение метода объявлено как суперкласс, поля
и методы подкласса будут невидимы. Обращение к суперклассу как к подклассу
называется 'downcasting', его нужно прописывать самостоятельно (то есть
привести объект к нужному подклассу).

Студенты часто забывают о приведении оъекта к подклассу. Чаще всего это
случается при использовании массивов объектов Object и коллекций из пакета
java.util (имеется ввиду Collection Framework). В примере ниже объект String
заносится в массив, а затем извлекается из массива для сравнения с другой
строкой. Компилятор обнаружит ошибку и не станет компилировать код, пока не
будет явно указано приведение типов.

Ошибочный пример .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Object arr[] =  new  Object[ 10 ];
arr[ 0 ] = "m"; 
arr[ 1 ] =  new  Character('m');

String arg = args[ 0 ];
 if  (arr[ 0 ].compareTo(arg) <  0 ) {
    System.out.println(arg + " comes before " + arr[ 0 ]);
}

Смысл приведения типов для некоторых оказывается затруднительным.
Особенно часто затруднения вызывают динамические методы. В примере выше,
если бы использовался метод equals вместо compareTo, компилятор бы не
выдал ошибку, и код бы правильно отработал, так как вызвался бы метод
equals именно класса String. Нужно понять, что динамическое связывание отличается от downcasting.

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Object arr[] =  new  Object[ 10 ];
arr[ 0 ] = "m"; 
arr[ 1 ] =  new  Character('m');

String arg = args[ 0 ];
 if  ( ((String) arr[ 0 ]).compareTo(arg) <  0 ) {
    System.out.println(arg + " comes before " + arr[ 0 ]);
}
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33347399
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13. Использование интерфейсов.

Для многих студентов не совсем ясна разница между классами и интерфейсами.
Поэтому, некоторые студенты пытаются реализовать интерфейсы, такие как
Observer или Runnable, с помощью ключевого слова extends, вместо implements.
Для исправления ошибки, нужно просто исправить ключевое слово на верное.

Ошибочный пример .
Код: plaintext
1.
2.
3.
4.
 public   class  SharkSim  extends  Runnable {
     float  length;
    ...
}

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
 public   class  SharkSim  implements  Runnable {
     float  length;
    ...
}

Связанная с этим ошибка: неправильный порядок блоков extends и implements.
Согласно спецификации Java, объявление о расширении класса должно идти
перед объявлениями о реализации интерфейсов. Также, для интерфейсов
ключевое слово implements нужно писать всего 1 раз, несколько интерфейсов
разделяются запятыми.

Еще ряд ошибочных примеров :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// Неправильный порядок
 public   class  SharkSim  implements  Swimmer  extends  Animal {
     float  length;
    ...
}

// ключевое слово implements встречается несколько раз
 public   class  DiverSim  implements  Swimmer  implements  Runnable {
     int  airLeft;
    ...
}

Исправленные примеры :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// Правильный порядок
 public   class  SharkSim  extends  Animal  implements  Swimmer {
     float  length;
    ...
}

// Несколько интерфейсов разделяются запятыми
 public   class  DiverSim  implements  Swimmer, Runnable {
     int  airLeft;
    ...
}
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33349312
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
14. Забыл использовать значение, возвращаемое методом суперкласса

Java позволяет вызывать из подкласса аналогичный метод суперкласса с
помощью ключевого слова keyword. Иногда студентам приходится вызывать
методы суперкласса, но при этом часто они забывают использовать
возвращаемое значение. Особенно часто это случается у тех студентов,
которые ещ не осмыслили методы и их возвращаемые значения.

В примере ниже студент хочет вставить результат метода toString()
суперкласса в результат метода toString() подкласса. При этом он не
использует возвращаемое значение метода суперкласса.

Ошибочный пример .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public   class  GraphicalRectangle  extends  Rectangle {
      Color fillColor;
       boolean  beveled;
      ...
       public  String toString() {
           super ();
           return ("color=" + fillColor + ", beveled=" + beveled);
      }
}

Для исправления ошибки обычно достаточно присвоить возвращаемое
значение локальной переменной, и затем использовать эту переменную
при вычислении результата метода подкласса.

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class GraphicalRectangle extends Rectangle {
      Color fillColor;
      boolean beveled;
      ...
      public String toString() {
          String rectStr = super();
          return(rectStr + " - " +
         "color=" + fillColor + ", beveled=" + beveled);
      }
}
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33349336
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
15. Забыл добавить AWT компоненты

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

Студенты иногда забывают об этих 2х шагах. Они создают компонент, но
забывают разместить его в окне приожения. Это не вызовет ошибок на этапе
компиляции, компонент просто не отобразится в окне приложения.

Ошибочный пример .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 public   class  TestFrame  extends  Frame  implements  ActionListener {
     public  Button exit;

     public  TestFrame() {
         super ("Test Frame");
        exit =  new  Button("Quit");
    }
}

Чтобы исправить эту ошибку, необходимо просто добавить компоненты к
своим родителям. Пример ниже показывает, как это сделать. Необходимо
заметить, что часто студент, забывший добавить компонент в окно приложения,
также забывает назначить слушателей событий для этого компонента.

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 public   class  TestFrame  extends  Frame  implements  ActionListener {
     public  Button exit;

     public  TestFrame() {
         super ("Test Frame");

        exit =  new  Button("Quit");

        Panel controlPanel =  new  Panel();
        controlPanel.add(exit);

        add("Center", controlPanel);

        exit.addActionListener( this );
    }

     public   void  actionPerformed(ActionEvent e) {
        System.exit( 0 );
    }
}
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33349365
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17. Забыл запустить поток

Многопоточность в Java реализуется с помощью класса java.lang.Thread.
Жизненный цикл потока состоит из 4х этапов: проинициализирован, запущен,
заблокирован и остановлен. ТОлько что созданный поток находится в
проинициализированном состоянии. Чтобы перевести его в запущенное
состояние, необходимо вызвать его метод start(). Иногда студенты создают
потоки, но забывают запустить их. Обычно ошибка возникает при недостаточных
знаниях студента о параллельном программировании и многопоточности. (прим.
перев.: не вижу связи) Чтобы исправить ошибку, необходимо просто запустить
поток.

В примере ниже, студент хочет создать анимацию картинки используя интерфейс
Runnable, но он забыл запустить поток.

Ошибочный пример .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 public   class  AnimCanvas  extends  Canvas  implements  Runnable {
         protected  Thread myThread;
         public  AnimCanvas() {
                myThread =  new  Thread( this );
        }

        // метод run() не будет вызван,
        // потому что поток не запущен.
         public   void  run() {
                 for ( int  n =  0 ; n <  10000 ; n++) {
                    try  { 
                     Thread.sleep( 100 ); 
                   }  catch  (InterruptedException e) { }
                   
                   animateStep(n);
                }       
        }
        ...
}

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 public   class  AnimCanvas  extends  Canvas  implements  Runnable {
         static   final   int  LIMIT =  10000 ;
         protected  Thread myThread;

         public  AnimCanvas() {
                myThread =  new  Thread( this );
                myThread.start();
        }

         public   void  run() {
                 for ( int  n =  0 ; n < LIMIT; n++) {
                         try  { 
                          Thread.sleep( 100 ); 
                        }  catch  (InterruptedException e) { }

                        animateStep(n);
                }
        }
        ...
}

Жизненный цикл потока и связь потоков и классов, реализующих
интерфейс Runnable - это очень важная часть программирования на Java,
и не будет лишним заострить свое внимание на этом.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33349472
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18. Использование запрещенного метода readLine() класса java.io.DataInputStream

В Java версии 1.0 для считывания строки текста необходимо было
использовать метод readLine() класса java.io.DataInputStream. В Java
версии 1.1 был добавлен целый набор классов для ввода-вывода,
обеспечивающий операции ввода-вывода для текста: классы Reader и
Writer. Таким образом с версии 1.1 для чтения строки текста надо
использовать метод readLine() класса java.io.BufferedReader. Студенты
могут не знат об этом изменении, особенно если они обучались по
старым книгам. (прим. перев. вообще-то уже не актуально. вряд ли кто-то
станет сейчас учиться по книгам 10летней давности.)

Старый метод readLine() оставлен в JDK, но объявлен как запрещенный, что
часто смущает студентов. Необходимо понять, что использование метода
readLine() класса java.io.DataInputStream не является неправильным, оно
просто устарело. Необходимо использовать класс BufferedReader.

Ошибочный пример .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 public   class  LineReader {
     private  DataInputStream dis;

     public  LineReader(InputStream is) {
        dis =  new  DataInputStream(is);
    }

     public  String getLine() { 
        String ret =  null ;

         try  {
          ret = dis.readLine();  // Неправильно! Запрещено.
        }  catch  (IOException ie) { }

         return  ret;
    }
}

Исправленный пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 public   class  LineReader {
     private  BufferedReader br;

     public  LineReader(InputStream is) {
        br =  new  BufferedReader( new  InputStreamReader(is));
    }

     public  String getLine() { 
        String ret =  null ;

         try  {
          ret = br.readLine(); 
        }  catch  (IOException ie) { }

         return  ret;
    }
}

Есть и другие запрещенные методы в версиях, более поздних чем 1.0, но
этот встречается чаще всего.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33349652
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
19. Использование типа double как float

Как и в большинстве других языков, в Java поддерживаются операции
над числами с плавающей точкой (дробными числами). В Java есть 2
типа-примитива для чисел с плавающей точкой: double для чисел с
64-битной точностью по стандарту IEEE, и float, для чисел с 32-битной
точностью по стандарту IEEE. Трудность заключается в использовании
десятичных чисел, таких как 1.75, 12.9e17 или -0.00003 - компилятор
присваивает им тип double.

Java не производит приведение типов в операциях, в которых может произойти
потеря точности. Такое приведение типов должен осуществлять программист.
Например, Java не позволит присвоить значение типа int переменной типа byte
без приведения типов, как показано в примере ниже.

Код: plaintext
1.
2.
 byte  byteValue1 =  17 ; /* неправильно! */
 byte  byteValue2 = ( byte ) 19 ; /* правильно */ 

Так как дробные числа представлены типом double, и присваивание double
переменной типа float может привести к потере точности, компилятор
пожалуется на любую попытку использовать дробные числа как float. Так что
использование присваиваний, приведенных ниже, не даст классу
откомпилироваться.

Код: plaintext
1.
2.
 float  realValue1 = - 1 . 7 ;          /* неправильно! */
 float  realValue2 = ( float )(- 1 . 9 ); /* правильно */ 

Это присваивание сработало бы в C или C++, для Java все гораздо строже.
Есть 3 способа избавиться от этой ошибки.

Можно использовать тип double вместо типа float. Это наиболее простое
решение. На самом деле нет особого смысла использовать 32-битную
арифметику вместо 64-битной, разницу в скорости все равно скушает
JVM (к тому же в современных процессорах все дробные числа приводятся
к формату 80-битного регистра процессора перед любой операцией).
Единственный плюс использования float - это то, что они занимают
меньше памяти, что бывает полезно при работе с большим числом дробных
переменых.

Можно использовать модификатор для обозначения типа числа, чтобы
сообщить компилятору как хранить число. Модификатор для типа
float - 'f'. Таким образом, компилятор присвоит числу 1.75 тип double,
а 1.75f - float. Например:

Код: plaintext
1.
2.
 float  realValue1 =  1 . 7 ;    /* неправильно! */
 float  realValue2 =  1 .9f;   /* правильно */ 

Можно использовать явное приведение типов. Это наименее элегантный способ,
но он полезен при конвертации переменной типа double в тип float. Пример:

Код: plaintext
1.
2.
3.
 float  realValue1 =  1 .7f; 
 double  realValue2 =  1 . 9 ;
realValue1 = ( float )realValue2;

Подробнее о числах с плавающей точкой можно почитать здесь и здесь .
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33349663
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все.

в примере 10 на самом деле допущена ошибка 9. я ее сразу заметил, но
забыл написать примечание. а исправлять не стал чтобы не было
расхождений с первоисточником

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33352590
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2А.Грасоff™: как насчет оформления FAQ?
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33352663
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov2А.Грасоff™: как насчет оформления FAQ?
я думал - чего лучше сделать? решил, что топик закрыть и поднять его
наверх с пометкой "важно", добаляя туда по необходимости текст.
письмо джуджу написал с просьбой поднять, но пока ничего.

если вариант с размещением этого текста в faq более разумен -
без проблем. хоть щас :)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353059
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай его в FAQ, а в ТОПЕ указать первым пунктом, хорошенько выделив.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353066
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovДавай его в FAQ, а в ТОПЕ указать первым пунктом, хорошенько выделив.
я за
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353158
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen
я за


+1

а еще в топе 2 раза пункт "2", а пункта "3" нет

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353163
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovДавай его в FAQ, а в ТОПЕ указать первым пунктом, хорошенько выделив.готово:

http://www.sql.ru/faq/faq_topic.aspx?fid=566
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353166
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deadyа еще в топе 2 раза пункт "2", а пункта "3" нет
давно туда смотрел? :)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353217
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.ГрасоffT wrote:

> готово: http://www.sql.ru/faq/faq_topic.aspx?fid=566

Поместил. ИМХО неплохо бы рекомендации по книгам дополнить.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353247
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопиющая несправедливость! а где указан переводчик и спасибо ему?????

и еще по пункту 9: его надо исправить в соответствии с комментарием в
конце фака

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353251
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deady
> вопиющая несправедливость! а где указан переводчик и спасибо ему?????


о, увидел. в самом начале мелкими буквами :-))))))

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353253
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deadyвопиющая несправедливость! а где указан переводчик и спасибо ему?????
what's up man???

http://www.sql.ru/faq/faq_topic.aspx?fid=566

PS конец топика прочитал, а начало???
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353255
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deadyвопиющая несправедливость! а где указан переводчик и спасибо ему?????
PS спасибо :)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353588
0sya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Deady 10. Использование объектов класса String как параметров метода.

В Java класс java.lang.String хранит строковые данные. Однако, строки в Java
(1) обладают постоянством (то есть их нельзя изменять),
(2) являются объектами.

Поэтому с ними нельзя обращаться как просто с буфером символов, это
неизменяемые объекты. Иногда студенты передают строки, ошибочно
расчитывая на то, что строка-объект будет передана как массив символов
по ссылке (как в C или C++). Компилятор обычно не считает это ошибкой.

Ошибочный пример .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public   static   void  main(String args[]) {
   String test1 = "Today is ";
   appendTodaysDate(test1);
   System.out.println(test1);
}

/* прим. редактора: закомментированный метод должен иметь модификатор
    static (здесь автором допущена ошибка №9)
public void appendTodaysDate(String line) {
    line = line + (new Date()).toString();
}
*/

 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

В примере выше студент хочет изменить значение локальной переменной test1,
присваивая новое значение параметру line в методе appendTodaysDate.
Естественно это не сработает. Значение line изменится, но значение test1
останется прежним.

Эта ошибка возникает из-за непонимания того, что (1) java объекты всегда
передаются по ссылке и (2) строки в Java неизменяемы. Нужно осмыслить, что
объекты-строки никогда не изменяют своего значения, а все операции над
строками создают новый объект.

прим. перев.вообще-то понять в чем ошибка не так просто.
так как объекты передаются по ссылке, то значит line ссылается туда же,
куда и test1. А значит создавая новый line, мы создаем новый test1.
в неправильном примере все выглядит так, как будто передача String идет
по значению, а не по ссылке.

Так что, String передается по значению? Или по ссылке, но не изменяется? В чем конкретно ошибка?
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353611
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0sya

> Так что, String передается по значению? Или по ссылке, но не
> изменяется? В чем конкретно ошибка?



в чем ошибка, описано в тексте - попытка измениить immutable.
в Java все объекты передаются по ссылке, а String неизменяем.

в итоге создается иллюзия передачи String по значению, а как это
сделано - для меня немного непонятно. Обсуждал это с другими
программерами. Думаю причина моего недопонимания - в том, что в Java
нет указателей, а я пытаюсь трактовать данный пример с точки зрения
указателей. Например, в C++ или Pascal данный пример точно бы
изменил строку.

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353671
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

переменной line присваивается ссылка на только что созданный новый объект (конкатенация строк line и текущей даты). Ссылка на старый (неизменившийся) объект ("Today is ") утеряна (внутри данного метода).
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353696
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333
Код: plaintext
1.
2.
 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

переменной line присваивается ссылка на только что созданный новый объект (конкатенация строк line и текущей даты). Ссылка на старый (неизменившийся) объект ("Today is ") утеряна (внутри данного метода).и?
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353699
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333
> public static void appendTodaysDate(String line) { line = line + (new Date()).toString();}

> переменной line присваивается ссылка на только что созданный
> новый объект (конкатенация строк line и текущей даты). Ссылка на
> старый (неизменившийся) объект ("Today is ") утеряна (внутри данного
> метода).Тема==Ответить




в конце концов я к этому и пришел )))

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353740
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ jdev333
Код: plaintext
1.
2.
 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

переменной line присваивается ссылка на только что созданный новый объект (конкатенация строк line и текущей даты). Ссылка на старый (неизменившийся) объект ("Today is ") утеряна (внутри данного метода).и?

тут еще наверное нужно знать, что когда объект передается в метод по ссылке, то на этот объект создается еще одна временная ссылка, именно с этой временной ссылкой и происходит работа в методе. В данном случае, новое значение (line + (new Date()).toString()) присвоено именно такой ссылке, которая при выходе из метода была убита, а иначе бы переменная line (глобальная), изменилась бы, даже несмотря на то, что создался новый объект.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353746
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen А.Грасоff™ jdev333
Код: plaintext
1.
2.
 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

переменной line присваивается ссылка на только что созданный новый объект (конкатенация строк line и текущей даты). Ссылка на старый (неизменившийся) объект ("Today is ") утеряна (внутри данного метода).и?

тут еще наверное нужно знать, что когда объект передается в метод по ссылке, то на этот объект создается еще одна временная ссылка, именно с этой временной ссылкой и происходит работа в методе. В данном случае, новое значение (line + (new Date()).toString()) присвоено именно такой ссылке, которая при выходе из метода была убита, а иначе бы переменная line (глобальная), изменилась бы, даже несмотря на то, что создался новый объект.
и? ты это все к чему вообще пишешь?
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353779
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ wessen А.Грасоff™ jdev333
Код: plaintext
1.
2.
 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

переменной line присваивается ссылка на только что созданный новый объект (конкатенация строк line и текущей даты). Ссылка на старый (неизменившийся) объект ("Today is ") утеряна (внутри данного метода).и?

тут еще наверное нужно знать, что когда объект передается в метод по ссылке, то на этот объект создается еще одна временная ссылка, именно с этой временной ссылкой и происходит работа в методе. В данном случае, новое значение (line + (new Date()).toString()) присвоено именно такой ссылке, которая при выходе из метода была убита, а иначе бы переменная line (глобальная), изменилась бы, даже несмотря на то, что создался новый объект.
и? ты это все к чему вообще пишешь?

вот тут человеку не совсем все понятно
Deady
в чем ошибка, описано в тексте - попытка измениить immutable.
в Java все объекты передаются по ссылке, а String неизменяем.

в итоге создается иллюзия передачи String по значению, а как это
сделано - для меня немного непонятно. Обсуждал это с другими
программерами. Думаю причина моего недопонимания - в том, что в Java
нет указателей, а я пытаюсь трактовать данный пример с точки зрения
указателей. Например, в C++ или Pascal данный пример точно бы
изменил строку.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353827
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenвот тут человеку не совсем все понятно:)
а он об этом знает?
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353836
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ wessenвот тут человеку не совсем все понятно:)
а он об этом знает?
о чем? о том, что ему чего то не понятно? :)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353839
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen А.Грасоff™ wessenвот тут человеку не совсем все понятно:)
а он об этом знает?
о чем? о том, что ему чего то не понятно? :)да
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353842
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen
> А.ГрасоffT wessenвот тут человеку не совсем все понятно:)
> а он об этом знает?
> о чем? о том, что ему чего то не понятно? :)Тема==Ответить




вы гоните. вроде еще только понедельник. я уже примерно все понял,
что и как. )))))

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354149
Osya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Deadyвы гоните. вроде еще только понедельник. я уже примерно все понял, что и как. )))))
Ну так объясни пожалста. :-)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354555
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Osya
Ну так объясни пожалста. :-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
public string s = "";
static {
   appendTodaysDate(s);
}
public static void appendTodaysDate(String line) {
    line = line + (new Date()).toString();
}  

как я понял:
пусть s указывает на адрес в куче: xxx.
в момент вызова создастся новая переменная line, которая указывает на
тот же адрес xxx.
теперь на xxx указывают 2 переменные.
при присваивании line нового значения создается новый объект String с
адресом yyy, и line указывает на него. а s по прежнему указывает на
xxx. Собственно поэтому метод и не работает так, как нужно.
А создается новый объект с новым адресом, потому что String реализует
паттерн Immutable.
при компиляции этой строки:
Код: plaintext
1.
line + (new Date()).toString();
компилятор заменит ее на что-то типа
Код: plaintext
1.
line = new StringBuffer().append(line).append(new Date().toString()).toString()

с обычными объектами такой номер не пройдет, потому что они не
реализуют Immutable. то есть, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class Test {

        public static void main(String[] args) {
                Person person = new Person();
                System.out.println("Person before: "+person);
                setNewAge(person);
                System.out.println("Person after: "+person);
        }

        public static void setNewAge(Person person) {
                person.setAge( 20 );
        }
}

class Person {
        private int age =  0 ;
        public int getAge () { return age; }
        public void setAge(int age) { this.age = age; }
        public String toString() {
                return "person: age="+age;
        }
}

выведет:
Код: plaintext
1.
2.
3.
4.
5.
---------- run java class ----------
Person before: person: age= 0 
Person after: person: age= 20 

Output completed ( 0  sec consumed) - Normal Termination
-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354617
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
объясни тогда вот это:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 public   class  Test {

         public   static   void  main(String[] args) {
                Person person =  new  Person();
                System.out.println("Person before: "+person);
                setNewAge(person);
                System.out.println("Person after: "+person);
        }

         public   static   void  setNewAge(Person person) {
                Person p =  new  Person();
                p.setAge( 10 );
                person = p;
        }
}

 class  Person {
         private   int  age =  0 ;
         public   int  getAge () {  return  age; }
         public   void  setAge( int  age) {  this .age = age; }
         public  String toString() {
                 return  "person: age="+age;
        }
}

Код: plaintext
1.
Person before: person: age= 0 
Person after: person: age= 0 
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354699
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так все понятно. person в сигнатуре метода - это копия переменной person из main, указывающей на объект, оперделенный в main. если мы обращаемся по этой переменной, то фактически обращаемся к старому объекту. если же мы присваиваем ей новое значение, то укывать она будет на новый объект, и работать мы будем с новым объектом. при этом указатель на старый объект не изменится.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354822
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все. догнал :-)
вот тут хорошо разжевано.
Ура. всё передается по значению :-)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354824
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deadyтак все понятно. person в сигнатуре метода - это копия переменной person из main, указывающей на объект, оперделенный в main. если мы обращаемся по этой переменной, то фактически обращаемся к старому объекту. если же мы присваиваем ей новое значение, то укывать она будет на новый объект, и работать мы будем с новым объектом. при этом указатель на старый объект не изменится. ... и поэтому, immutable здесь не причем.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354840
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
именно причем. я ж привел пример, из которого видно, что не с
immutable объектами такое не пройдет.

я имею ввиду, что :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  public static void setDate(String line) {
     line.setText("qwerty");//(Предположим, что такой метод есть) не сработает! так как String - immutable.
  }
  public static void setDate(String line) {
     line = "qwerty";//сработает! так как создается новый объект. line указывает на него. Но глобальная переменная не изменилась!
  }
  public static void setAge(Person line) {
     line.setAge( 20 );//сработает! так как Person - НЕ! immutable.
  }
  

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354853
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
...// (Предположим, что такой метод есть) не сработает! так как String - immutable.

:))
ок, давай теперь разбираться, что же такое иммутабле объекты???
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354867
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
че предполагать то?
метода String.setText() нет, так как действительно String реализует паттерн immutable, но к передаче параметров это не имеет отношения.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354870
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen
> автор
> ...//(Предположим, что такой метод есть) не сработает! так как String - immutable.

> :))
> ок, давай теперь разбираться, что же такое иммутабле объекты???




immutable - читай final.

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354875
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm...но к передаче параметров это не имеет отношения.
вот и про то же
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354879
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторприм. редактора: верно - ВСЕ ПАРАМЕТРЫ В JAVA ПЕРЕДАЮТСЯ ПО ЗНАЧЕНИЮ. Если параметр - ссылка на объект, то ЗНАЧЕНИЕМ является ЗНАЧЕНИЕ самой ссылки, а не значение разнообразных полей в объекте, коих может быть великое множество, как по количеству, так и по разнообразию типов
:(
1)все параметры передаются по значению
2)если параметр-ссылка смотри пункт первый?
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354881
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen Timm...но к передаче параметров это не имеет отношения.
вот и про то же
т.е.
вот и я про то же
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354885
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naug
> :(
> 1)все параметры передаются по значению
> 2)если параметр-ссылка смотри пункт первый?Тема==Ответить



жжешь :-))))

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354889
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
короче - при передаче в метод объектов, реализующих паттерн immutable, значение объекта не может измениться ни при каких обстоятельствах (впрочем, оно никогда не может измениться ).
в противном случае - может измениться, если вызываются методы этого объекта. вот и все. при этом если попытаться присвоить переданный параметр другому объекту, то влияния на значение переданного объекта (на его поля, в метод то передастся значение ссылки ) это никакого не окажет.
типа вот :-)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354892
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deady Naug
> :(
> 1)все параметры передаются по значению
> 2)если параметр-ссылка смотри пункт первый?Тема==Ответить



жжешь :-))))

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3

это правда
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354896
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm
> короче - при передаче в метод объектов, реализующих паттерн
> immutable, значение объекта не может измениться ни при каких
> обстоятельствах (впрочем, оно никогда не может измениться ).
> в противном случае - может измениться, если вызываются методы
> этого объекта. вот и все. при этом если попытаться присвоить
> переданный параметр другому объекту, то влияния на значение
> переданного объекта (на его поля, в метод то передастся значение
> ссылки ) это никакого не окажет.
> типа вот :-)




я это и толдычу уже несколько постов.

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354903
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты чета талдычишь про иимьютабл объекты, которые передаются в метод. а что про них говорить то??
ну не могут они в принципе измениться, нигде. а я пытался понять что происходит при передаче объекта вообще.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354932
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может вот так было бы понятней:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 public   class  Test {

         public   static   void  main(String[] args) {
                Person person =  null ;
                System.out.println("Person before: "+person);
                setNewAge(person);
                System.out.println("Person after: "+person);
        }

         public   static   void  setNewAge(Person person) {
                person =  new  Person();
                person.setAge( 10 );
        }
}

глобальная пременная person, все равно останется null;
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354936
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
че в топик-то так нагадили?
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354940
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenможет вот так было бы понятней:
Код: plaintext
\n public   class  Test {\n\n         public   static   void  main(String[] args) {\n                Person person =  null ;\n                System.out.println("Person before: "+person);\n                setNewAge(person);\n                System.out.println("Person after: "+person);\n        }\n\n         public   static   void  setNewAge(Person person) {\n                person =  new  Person();\n                person.setAge( 10 );\n        }\n}\n

глобальная пременная person, все равно останется null;

было
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354944
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm Deady Naug
> :(
> 1)все параметры передаются по значению
> 2)если параметр-ссылка смотри пункт первый?Тема==Ответить



жжешь :-))))

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3

это правда
а что такое значение ссылки? Если ВСЁ ПЕРЕДАЁТСЯ ПО ЗНАЧЕНИЮ то откуда термин ссылки вообще в яве взялся?

вот есть объект, отправляем его как параметр. Соответственно метод получает ссылку на объект и всё что происходит с переменной внутри метода изменяет изначальный объект.
Однако если если переменной внутри метода присваивается новое значение то получается что эта ссылка указывает на новый объект все изменения с которым идут лесом после закрытия метода.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354945
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm wessenможет вот так было бы понятней:
Код: plaintext
\n public   class  Test {\n\n         public   static   void  main(String[] args) {\n                Person person =  null ;\n                System.out.println("Person before: "+person);\n                setNewAge(person);\n                System.out.println("Person after: "+person);\n        }\n\n         public   static   void  setNewAge(Person person) {\n                person =  new  Person();\n                person.setAge( 10 );\n        }\n}\n

глобальная пременная person, все равно останется null;

было

я оттуда и взял, но немного переделал.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354954
Liner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно почитать тынц
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33356608
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
69 сообщений из 69, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / ошибки начинающих java-программистов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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