Public class line java

Ошибки начинающих java-программистов. Часть 1

Java-университет

1. Имя класса отличается от имени файла, в котором он хранится

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

Ошибки начинающих java-программистов. Часть 1 - 1

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

 public class Airplane extends Vehicle Seat pilot; public Airplane() < pilot = new Seat(); >> 
 public class Airplane extends Vehicle Seat pilot; public Airplane() < pilot = new Seat(); >> 

Заметьте: предполагается, что имя класса начинается с заглавной буквы. В операционных системах, которые учитывают регистр символов в именах файлов, могут появиться дополнительные проблемы, особенно у студентов, изучающих Java под Unix, и привыкших к системеm именования файлов в DOS. Класс MotorVehicle должен храниться в файле MotorVehicle.java , но не в файле motorvehicle.java .

2. Сравнение с помощью ==

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

 // проверим, равен ли первый аргумент "-a" if (args[0] == "-a")

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

 // проверим, равен ли первый аргумент "-a" if ("-a".equals(args[0]))

Эта ошибка — дурацкая, потому что на самом деле Java код получается синтаксически правильным, а в итоге работает не так как нужно. Некоторые студенты также пытаются применять операторы сравнения > и , вместо метода compareTo() класса java.lang.String . Эту ошибку обнаружить проще, потому что она вызывает ошибки на этапе компиляции.

Читайте также:  Переопределение методов си шарп

3. Забыл проинициализировать объекты, являющиеся элементами массива.

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

 // Создаем массив из StringBuffer StringBuffer [] myTempBuffers; myTempBuffers = new StringBuffer[3]; myTempBuffers[0].add(data); 

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

 // Создаем массив из StringBuffer и инициализируем элементы StringBuffer [] myTempBuffers; myTempBuffers = new StringBuffer[3]; for (int ix = 0; ix < myTempBuffers.length; ix++) myTempBuffers[ix] = new StringBuffer(); myTempBuffers[0].add(data); 

4. Помещение в один файл сразу нескольких классов с модификатором public

Файлы с исходным java-кодом определенным образом связаны с классами, содержащимися в этих файлах. Связь можно охарактеризовать так: Любой Java-класс хранится не более чем в одном файле. В любой файл с исходным кодом можно поместить не более 1-го класса с модификатором public . Если в файле с исходным кодом есть класс с модификатором public , имя файла и имя класса должны быть строго одинаковыми (прим. перев.: до регистра, см. п.1) Иногда студенты забывают о 2-ом правиле, что приводит к ошибкам на этапе компиляции. Сообщение об ошибке для 2-го и 3-го правила будет одинаковым (в чем собственно и заключается трудность распознания этой ошибки).

5. Подмена поля класса локальной переменной.

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

 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-ой способ - не наш метод. К тому же он не гарантирует, что я когда нибудь случайно не подменю поле переменной. Еще большая трудность возникнет при наследовании, когда я вообще не вижу, какие поля есть у класса) Исправленный пример:

 // 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; > 

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

немного сумбурно, но смысл такой

то есть в конструкторе все смотрится красиво, но для обычных методов применять это не следует.

6. Забыл вызвать конструктор родителя (суперкласса)

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

 public class JavaClassFile extends File < String classname; public JavaClassFile(String cl) < classname = cl; >> 

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

 public class JavaClassFile extends File < String classname; public JavaClassFile(String cl) < super(cl + ".class"); classname = cl; >> 

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

7. Неправильный перехват исключений

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

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

 try < serviceSocket.setSoTimeout(1000); newsock = serviceSocket.accept(); >catch (IOException ie) < message("Error accepting connection."); >catch (SocketException se)
 try < serviceSocket.setSoTimeout(1000); newsock = serviceSocket.accept(); >catch (SocketException se) < message("Error setting time-out."); >catch (IOException ie)

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

 public void waitFor(int sec)
 public void waitFor(int sec) throws InterruptedException

8. Метод доступа имеет тип void

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

Ука зание неправильного возвращаемого типа порождает целый класс ошибок. Обычно компилятор распознает эти ошибки и сообщает о них, так что студенты могут самостоятельно их исправить. Автор: А.Грасоff™ Читать продолжение Ссылка на первоисточник: Ошибки начинающих java-программистов

Источник

В чем отличие между class и public class в Java?

Во всех ресурсах посвященных модификаторам доступа описывается работа членов и методов класса, я в гугле до 3й странице дашел, но конкретно так и не нашел ответа на этот вопрос. Так же я иногда вижу как некоторые обьявляют класс просто class, а в конструкторе класса указывают уже public class.
Я подумал, что если указать public class, то можно будет получить доступ к классу из другого пакета, но это не так. Так для чего же используется public class и способ по умолчанию class и что он значит?

firezhek

Странный вопрос, ну да ладно. Смотри. class <> , access modifier = (private ,protected, default(none), public) . Пабликом ты говоришь, что класс доступен из других пакетов, при этом конструктор может быть паблик, а у класса стоять просто class. Но в этом не будет смысла, так как ты не сможешь использовать этот класс в другом пакете , так как модификатор доступа у тебя package-private у класса.

Модификатор конструктора ,по-сути в твоем случае, просто ограничивает область , где ты можешь инициализировать этот класс. А модификатор класса, где будет доступен твой класс.

package1; public class Animal < Animal()<>> public static void gav() < >> package2; public class ZooPark < public void main(String[] args) < Animal animal = new Animal(); // ошибка здесь, конструктор не доступен т.к. package-private Animal.gav(); //- ок , класс доступен, статик тоже доступен. ps статик метод тоже публичный >>

Источник

Оцените статью