— Здравствуй, салага, который каждый день делает кучу ошибок даже в простейших программах!

— Эм… Привет, Диего. Однако умеешь ты приободрить!.

— Конечно умею! Умей зреть в суть. Сказано же — “каждый день”. В переводе с мизантропического эта фраза значит “будущий успешный программист, если, конечно, не забьет”.

— Ооо, ну тогда спасибо, о самый металлический мой учитель!.

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

Забыли точку с запятой

— Самая частая ошибка начинающих программистов Java — это точка с запятой. Вернее, отсутствие её там, где она должна быть.

— Чистая правда… Грешил этим неоднократно..

— Каждая команда внутри метода должна заканчиваться точкой с запятой. Точка с запятой — это разделитель команд: таким образом мы даем понять Java-компилятору, где заканчивается одна команда и начинается следующая.

Примеры ошибочных ситуаций:

Код с ошибками Исправленный код
int a
int b = 5
int c = a + b
int a;
int b = 5;
int c = a + b;
System.out.println("Hello")
System.out.println("Hello");
if (2 > 3)
   System.out.println("Мы в Австралии?")
if (2 > 3)
   System.out.println("Мы в Австралии?");
undefined
11
Задача
Java Syntax Pro, 11 уровень, 5 лекция
Недоступна
Сравнение строк
В методе main объявлены переменные типа String. В консоли выводится результат их сравнения: если строки равны, выводится true, иначе — false. Тебе нужно раскомментировать одну строку, чтобы получился следующий вывод: true true Тело метода main менять нельзя: можно только раскомментировать одну стр

Забыли закрыть кавычки

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

Каждая строка в коде должна быть с двух сторон обрамлена двойными кавычками — «"». Начинающие программисты очень часто пишут кавычки в начале текста, но забывают закрыть их в конце.

Код с ошибками Исправленный код
String s = "Привет;
String s = "Привет";
System.out.println("Hello);
System.out.println("Hello");
String s = "Привет";
String message = s + " и пока. ;
String s = "Привет";
String message = s + " и пока.";
undefined
11
Задача
Java Syntax Pro, 11 уровень, 5 лекция
Недоступна
Два айфона
В методе main создаются два айфона с одинаковыми параметрами. В консоли выводится результат их сравнения. Разберись, почему сейчас результат отрицательный и сделай так, чтобы он был положительным. Для этого тебе нужно переопределить метод equals(Iphone), который будет учитывать все параметры. У двух

Забыли знак плюс при склеивании строк

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

Примеры таких ситуаций:

Код с ошибками Исправленный код
String s = "Привет";
String message = s  " и пока.";
String s = "Привет";
String message = s + " и пока.";
int age = 35;
System.out.println("Age=" age);
int age = 35;
System.out.println("Age=" + age);
int age = 35;
System.out.println("Age=", age);
int age = 35;
System.out.println("Age=" + age);
undefined
11
Задача
Java Syntax Pro, 11 уровень, 5 лекция
Недоступна
Создаем свой hashCode
Напиши свою реализацию hashCode, используя переменные model и year. Если эти поля у двух объектов одинаковые, то должен возвращаться одинаковый hashCode. Если правильно реализовать метод hashCode, вывод должен быть таким: true true true true false false

Забыли закрыть фигурные скобки

— Это очень распространенная ошибка. Обычно она возникает в двух случаях:

  1. Ты решил скопировать откуда-то код и случайно пропустил некоторые фигурные скобки.
  2. Ты вообще не следишь за тем, чтобы каждой открывающей скобке соответствовала закрывающая скобка.

— Второй случай — это мой вариант. Иногда так увлекаюсь, что забываю!.

— Чтобы избежать подобных ошибок, новичкам в программировании обычно рекомендуется писать закрывающую фигурную скобку строго под открывающей.

Примеры:

Код с ошибками Исправленный код
if (2 < 3)
{
   if (3 < 4)
   {
      System.out.println("Математика!");
   }
if (2 < 3)
{
   if (3 < 4)
   {
      System.out.println("Математика!");
   }
}
{
   if (2 < 3)
   {
      if (3 < 4)
      {
         System.out.println("Математика!");
      }
   }
{
   if (2 < 3)
   {
      if (3 < 4)
      {
         System.out.println("Математика!");
      }
   }
}

Забыли написать круглые скобки

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

Первый вариант — банально забыли поставить скобки в конце вызова метода:

Второй вариант — забыли обернуть в скобки условие оператора if-else.

Примеры:

Код с ошибками Исправленный код
System.out.println("Привет!");
System.out.println;
System.out.println("И пока!");
System.out.println("Привет!");
System.out.println();
System.out.println("И пока!");
if 2 < 3
{
   if 3 < 4
   {
      System.out.println("Математика!");
   }
}
if (2 < 3)
{
   if (3 < 4)
   {
      System.out.println("Математика!");
   }
}

Неправильно написан заголовок метода main

— Как только не пишут многострадальный заголовок метода main! Наверное, ни над чем так не издеваются новички, как над этим бедным методом. И главное, потом всегда удивляются: а чего это наша программа не запускается? И, конечно, дело не в программисте, а в программе, компиляторе, валидаторе, Java-машине. Список виновных можно продолжать бесконечно.

Примеры:

Код с ошибками Пояснение
static void main(String[] args)
Пропущен public
public void main(String[] args)
Пропущен static
public main(String[] args)
Пропущен static и void
void main(String[] args)
Пропущены public и static
public static void main(String args)
Пропущены []
public static void main()
Пропущены String[] args
public static int main(String[] args)
Вместо void написано int

Имя файла отличается от имени класса

— Согласно стандарту, все классы в Java должны храниться в файле, название которого совпадает с именем класса. И как уже раньше говорилось, регистр букв тут тоже имеет значение:

Имя файла Имя класса Примечание
Solution.java Solution Все отлично
Solutions.java Solution Лишняя буква s в названии файла
solution.java Solution Название файла с маленькой буквы
Solution.txt Solution Расширение файла txt вместо Java
Solution.java solution Название класса с маленькой буквы

— Вообще-то в файле с расширением java может быть объявлено несколько классов, но только у одного из них перед именем может быть слово public. Вот его-то имя и должно совпадать с именем файла.

— В файле с расширением java всегда должен быть класс, имя которого совпадает с именем файла, и у него есть модификатор public. Пример:

Solution.java
public class Solution
{
}

class Apple
{
}

class Pineapple
{
}

— Также в языке Java разрешено писать классы в классах. Это тоже способ обойти озвученное выше ограничение. Если в файле объявлен публичный класс (с модификатором public), имя которого совпадает с именем файла, внутри этого публичного класса можно объявлять сколько угодно классов. Хотя это уже будут не обычные, а внутренние или вложенные классы. Пример:

Solution.java
public class Solution
{
   public class Apple
   {
   }

   public static class Pineapple
   {
   }
}

Забыли написать package

— Поскольку в программах обычно тысячи классов, всем из них сложно подобрать простые, понятные и уникальные имена. Поэтому в Java все классы принято группировать по пакетам — package. Точно так же, как файлы группируются по папкам.

— Ага, поэтому в начале каждого класса нужно писать пакет, которому он принадлежит..

— Именно. Вот пример:

Код без пакета Исправленный пример
public class Solution
{
}
package com.javarush.tasks.task0001;

public class Solution
{
}

Забыли добавить import

— Если мы хотим в нашей программе использовать какой-то чужой класс, у нас есть два варианта: мы должны везде в нашем коде писать перед именем этого класса еще и имя его пакета. Или же мы можем один раз написать полное имя класса со словом import. Пример:

Без использования import С использованием import
public class Solution
{
   java.util.Scanner scanner = new java.util.Scanner();
}
import java.util.Scanner;

public class Solution
{
   Scanner console = new Scanner();
}

— Оба варианта рабочие, но вот если ты в своем коде будешь писать просто Scanner, а import не добавишь, компилятор не сможет понять, из какого пакета ему нужно брать класс Scanner, и компилировать программу не будет.

— Спасибо, Диего. Эта лекция заставит меня быть внимательнее..

— На это и был расчёт. Удачи!