Я делал небольшие программы в java. Я знаю, что если я напишу while(true);
, программа замерзнет в этом цикле. Если код такой:
Тест 1:
public class While {
public static void main(String[] args) {
System.out.println("start");
while (true);
System.out.println("end");
}
}
Компилятор выдает мне ошибку:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Unreachable code
at While.main(While.java:6)
Я не знал, что эта ошибка существует. Но я понял, почему он брошен. Конечно, строка 6 была недоступна, что вызвало проблему компиляции. Затем я протестировал это:
Тест 2:
public class While {
public static void main(String[] args) {
System.out.println("start");
a();
b();
}
static void a() {
while(true);
}
static void b() {
System.out.println("end");
}
}
По какой-то причине программа работает нормально (консоль напечатала "start", а затем заморозилась). Компилятор не смог проверить внутри void a()
и убедиться, что он недоступен. Конечно, я пробовал:
Тест 3:
public class While {
public static void main(String[] args) {
System.out.println("start");
a();
System.out.println("end");
}
static void a() {
while(true);
}
}
Тот же результат, что и Тест 2.
После некоторого исследования я нашел этот question. Итак, если код внутри скобок является переменной, компилятор не будет генерировать исключение. Это имеет смысл, но я не думаю, что то же самое относится к voids
.
Q: Итак, почему компилятор просто выбросил мне ошибку в Test 1, если void b()
(тест 2) и System.out.println("end");
(Тест 3) недоступен?
EDIT: Я пробовал тест 1 в С++:
#include <iostream>
using namespace std;
int main()
{
cout << "start" << endl;
while(true);
cout << "end" << endl;
return 0;
}
Компилятор не выдавал никаких ошибок, тогда я получил тот же результат, что и Test 2, и как тест 3. Итак, я полагаю, что это Java-версия?