Слишком много людей помещают объекты, которые не являются потокобезопасными в одноэлементном шаблоне. Я видел примеры DataContext ( LINQ & nbsp; to SQL-файл ), выполненный в одноэлементном шаблоне, несмотря на то, что DataContext не является потокобезопасным и является чисто единичным объектом.
Спецификация языка Java говорит, что:
Пустое заявление
Пустое утверждение ничего не делает.
EmptyStatement: ;
Выполнение пустой инструкции всегда выполняется нормально
Это по сути означает, что вы хотите выполнить пустую инструкцию, если a == b
if(a == b);
Что вы должны сделать:
Существует две основных решения этой проблемы:
- Вы можете избежать проблем с пустой инструкцией с помощью форматирования кода и окружающего материала внутри
if
с{
и}
. Сделав это, ваш пустой оператор будет намного читабельнее.if(a == b){ ; }
- Вы также можете проверить инструменты, используемые для анализа статического кода, такие как: [/g6] Findbugs Checkstyle Pmd Они могут мгновенно выделить такие проблемы, как этот.
Я бы рекомендовал объединить оба решения.
Java допускает пустой блок в любом месте, где разрешен блок-оператор. Я уверен, что это общее правило для всех блоков упрощает компилятор.
Я согласен, что это в первую очередь причина ошибок, которые очень сложно найти. Я всегда использую фигурные скобки вокруг блоков, даже если есть один оператор, но Java позволяет вам сделать блок с фигурными скобками в любой момент, поэтому использование фигурных скобок не может спасти вас от этой участи. Например, я однажды потратил 4 часа на то, чтобы найти что-то вроде этого:
while (condition);
{
statement;
statement;
}
Точка с запятой в конце первой строки была опечаткой, случайно сделавшей блок оператора для цикла while пустым. Поскольку синтаксис действителен, программа скомпилирована и работает нормально, просто не так, как я этого хотел. Было действительно трудно найти.
Я могу подумать о одной ситуации, когда очень приятно , что вам разрешено иметь пустые блоки, и это что-то вроде этого:
if (condition1) {
do_action_1();
}
else if (condition2) {
//nothing really to do in this case
}
else if (condition3) {
do_action2();
}
else {
do_action3();
}
В приведенном выше примере вы хотите иметь возможность разделить различные условия. Помните, что эти условия могут быть перекрывающимися, поэтому не всегда возможно изменить порядок. Если одному из условий действительно ничего не нужно, то хорошо, что Java позволяет вам иметь пустой блок. В противном случае языку понадобится некоторая форма метода «noop» для использования, когда вы действительно ничего не хотите делать.
Я лично предпочел бы явный оператор noop, но это не так, как определена Java.
Если вы используете оператор if
, первый оператор после if
будет выполнен, если условие истинно. Если у вас есть блок после if
(с фигурными фигурными скобками), он учитывает весь этот блок. Если нет блока, он учитывает только один оператор. Единая точка с запятой - это пустой оператор. Вы также можете написать код из примера:
if(a==b) {
;
}
Во время работы над назначением программирования для класса, где я работаю с сеткой N to N из doodads и сравнивая характеристики случайного doodad с приведенными выше, ниже, слева и справа, я нашел приятное использование этого для предотвращения вложенных операторов и возможных граничных исключений. Моя цель заключалась в том, чтобы свести к минимуму код и не вставлять if-statements.
if (row == 0);
else (method (grid[row][col], grid[row-1][col]));
if (row == N-1);
else (method (grid[row][col], grid[row+1][col]));
if (col == 0);
else (method (grid[row][col], grid[row][col-1]));
if (col == N-1);<br>
else (method (grid[row][col], grid[row][col+1]));
, где method(Doodad a, Doodad b)
выполняет некоторую операцию между a и b.
В качестве альтернативы вы можете использовать обработку исключений, чтобы избежать этого синтаксиса, но он работает и хорошо работает для моего приложения.
if(row != 0) method (grid[row][col], grid[row-1][col]);
будет иметь тот же эффект без использования пустых if
операторов.
– intcreator
27 June 2017 в 16:34
Несколько определений из jls объясняют это (глава 14):
Как указано здесь , Block
является StatementWithoutTrailingSubstatement
, который, в свою очередь, является StatementNoShortIf
, который является Statement
. Таким образом, когда требуется какое-либо из них, мы можем вставить Block
.
. Хотя это также относится к for
и while
-loops, я буду использовать if
-значения. Эти правила почти одинаковы. Синтаксическое описание if-statements
можно найти здесь здесь .
IfThenStatement:
if ( Expression ) Statement
IfThenElseStatement:
if ( Expression ) StatementNoShortIf else Statement
IfThenElseStatementNoShortIf:
if ( Expression ) StatementNoShortIf else StatementNoShortIf
Итак, мы можем использовать наш блок здесь.
;
определяется как EmptyStatement
( link ), что также является StatementNoShortIf
. Поэтому в условных фрагментах кода, таких как if-statement
и циклы, мы можем заменить Block
на EmptyStatement
, если требуется StatementNoShortIf
или Statement
.
Таким образом, if(Expression)EmptyStatement
works.
Довольно просто: java дает ошибку, если находит недопустимый синтаксис. Но В вашей среде IDE должна быть опция для включения такого предупреждения. Для eclipse см. Ответ if(Expression)EmptyStatement
- вполне допустимый синтаксис. Вместо этого javac
выдает предупреждение при запуске с соответствующими параметрами. Полный список предупреждений, которые могут быть отключены для , для этой цели содержит имя-предупреждение empty
. Таким образом, компиляция с -Xlint:all
или -Xlint:empty
будет генерировать предупреждение об этом. Ctrl + Shift + A
, ввести empty body
в поле поиска и включить предупреждение (помечено на изображении)
Честно говоря, в нем мало пользы с минималистской точки зрения. Обычно есть способ добиться успеха без команды «ничего не делать». Скорее, речь идет о личных предпочтениях, предпочитаете ли вы использовать
if( a() && b() );
или
if( a() ) b();
, и это применимо и к другим случаям, в которых используется EmptyStatement
. Важным моментом для рассмотрения этой темы является читаемость кода. Бывают случаи, когда код становится более читаемым, используя no-op. С другой стороны, есть случаи, когда код становится намного сложнее понять с помощью EmptyStatement
- приведенный выше пример будет рассчитывать на более позднюю IMO.
Это старый остаток от дней, когда для отличия выражений от операторов был больше синтаксического сахара.
В принципе, запятая была использована как разделитель элементов списка, поэтому точка с запятой использовалась как " список операторов "разделитель. Недостаток заключается в обработке нулевых элементов в списках и нулевых операторов в блоках.
В списке элементов Java использует явное ключевое слово null
, но «нулевой оператор» является просто пустым линия. Разрешение существования пустой строки - это удержание из традиции, унаследованной от C.
Зачем? Особенно с инструкцией if
, когда вы знаете, что никакие утверждения не выполняются: поскольку некоторые операторы if имеют побочные эффекты:
int c;
if ((c = in.read()) != -1);
Да, это не лучший пример, но в основном он говорит, что читать байт из потока и ничего не делать. Может быть полезно в некоторых случаях, но даже если этот пример не самый лучший, он иллюстрирует намерение. Мы хотим ощущать побочные эффекты выражения без случайного выполнения каких-либо утверждений.
if(a==b)
println("a equals b");
Вы можете использовать оператор IF без {}
, если есть только одна строка, которая должна быть выполнена, поэтому, используя if(a==b);
, вы говорите, если они равны, выполняют и пустую инструкцию ... Так что это будет ничего не делать, а затем вернуться в ваш обычный цикл, вне блока IF.
Точка с запятой в конце, если (a == b); просто закончить оператор в одной строке, что означает игнорировать результат условия и продолжить выполнение из следующей строки. Этот код полезен, с другой стороны, когда-то вводит ошибку в программу, например, случай 1. a = 5; b = 3; если (a == b); prinf («a и b равны»); случай 2. a = 5; b = 5; если (a == b); prinf («a и b равны»); будет печатать тот же результат на экране ...
Если вы используете Eclipse, вы можете предупредить вас об этих утверждениях:
[/g0]
Я могу думать о сценарии, где требуется пустой оператор (не для условия if
, а для цикла while
).
Когда программа просто хочет получить явное подтверждение от пользователя для продолжения. Это может потребоваться, когда работа после подтверждения пользователя зависит от некоторых других вещей, и пользователь хочет взять под контроль, когда продолжить.
System.out.println("Enter Y to proceed. Waiting...");
System.out.println("");
while(!(new Scanner(System.in).next().equalsIgnoreCase("Y")));
System.out.println("Proceeding...");
// do the work here
Я не могу придумать, где это полезно. Это может быть полезно для циклов типа
while(do something);
или
for(init; do something; something else);
Если вы регулярно используете форматирование кода в своей среде IDE, эти ошибки становятся очевидными. Некоторые IDE выделяют это как вероятную ошибку.
Просто FYI о юзабилити и , какую разницу он делает или может сделать, если существует такая инструкция
. Рассмотрим фрагмент кода, такой как следующий.
int a = 10;
if ((a = 50) == 50);
System.out.println("Value of a = " + a);
Ясно, что в этом случае оператор if
изменяет вывод. Таким образом, подобное заявление может иметь значение.
Это ситуация, когда это может быть полезно или лучше сказать, влияют на программу.
if (a==b) { // do nothing } else { doSomething(); }
, так как более очевидно, что no-op предназначен специально, а не опечатка.
– yshavit
5 January 2013 в 22:36
Есть ли какая-нибудь ситуация, в которой это было бы полезно?
Полезно? Как в разделе «делает ваш код более чистым, понятным, быстрым, более удобным»? Не за что. Это, скорее всего, плохой, запутанный код .
Но это не обязательно доброкачественное . Такое утверждение может выполнять действия и / или изменять состояние из-за методов, которые вызывают побочные эффекты, и опционально оценивать эти методы из-за короткого замыкания операторов .
if( a() && b() );
Здесь ,
a()
илиb()
может что-то сделать, аb()
выполнится, только еслиa()
истинно.Что касается , почему , я думаю, что ответ просто что было бы хуже отклоняться от определенного ожидаемого поведения (например, таких как
while(reader.read());
), чем альтернатива разработчикам, которые пишут плохой код.Написание плохого кода всегда возможно. И просто повторить, это будет плохой код практически в любом случае.
if(!a()) b();
– yshavit
1 January 2013 в 19:34
a() && b()
будет AssignmentExpression i>.
– Gumbo
2 January 2013 в 18:21
Я согласен с вами, что для человека нет никакой полезной цели. Я подозреваю, что он там, потому что он упрощает определение языка; это означает, что вещь, которая приходит после if
, такая же, как вещь, которая приходит после while
, например.