Ошибка unreachable statement
Прохожу урок на StartAndroid, возникла ошибка в коде, не могу понять как исправить, нужный класс импортирован, всё переписал как в примере, помогите разобраться. Ошибка unreachable statement на строке:
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo();
public class MainActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks < private static final int CM_DELETE_ID = 1; ListView lvData; DB db; SimpleCursorAdapter simpleCursorAdapter; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); db = new DB(this); db.open(); String[] from = new String[]; int[] to = new int[]; simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.item, null, from, to, 0); lvData = (ListView) findViewById(R.id.lvData); lvData.setAdapter(simpleCursorAdapter); registerForContextMenu(lvData); getSupportLoaderManager().initLoader(0, null, this); > public void onButtonClick(View view) < db.addRec("sometext " + (simpleCursorAdapter.getCount() + 1), R.drawable.alligator); getSupportLoaderManager().getLoader(0).forceLoad(); >@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) < super.onCreateContextMenu(menu, v, menuInfo); menu.add(0, CM_DELETE_ID, 0, R.string.delete_record); >@Override public boolean onContextItemSelected(MenuItem item) < return super.onContextItemSelected(item); if (item.getItemId() == CM_DELETE_ID) < AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo(); db.delRec(acmi.id); getSupportLoaderManager().getLoader(0).forceLoad(); return true; >return super.onContextItemSelected(item); > @Override protected void onDestroy() < super.onDestroy(); db.close(); >@Override public Loader onCreateLoader(int id, Bundle args) < return new MyCursorLoader(this, db); >@Override public void onLoadFinished(Loader loader, Cursor data) < simpleCursorAdapter.swapCursor(data); >@Override public void onLoaderReset(Loader loader) < >static class MyCursorLoader extends CursorLoader < DB db; public MyCursorLoader(Context context, DB db) < super(context); this.db = db; >@Override public Cursor loadInBackground() < Cursor cursor = db.getAllData(); try < Thread.sleep(18000); >catch (InterruptedException e) < e.printStackTrace(); >return cursor; > > >
Вопрос №65807 от пользователя Евгений Чернышов в уроке «Условные конструкции», курс «Основы Java»
https://ru.hexlet.io/code_reviews/568731 Добрый день еще раз, т.к. не разобрался самостоятельно как у себя воткнуть StringUtils, то сделал другим способом и вроде бы все работает, но компилятор Hexlet на что-то незначительное ругается. И еще в ходе работы возникло несколько вопросов: 1) Почему если я поставлю первый if с equals в конец, то Java ругается: «unreachable statement «, как я гуглил то это из-за return. 2)Не получается согласно заданию выставить именно «»(Без пробела idea ругается: «В любом случае будет false», а при проверке в main методе не дает скомпилироваться. ), а вот » » прекрасно работает
Добрый день, Евгений! Сейчас индекс строки 0 выходит за пределы строки:
Представьте, что будет, если на вход будет передана пустая строка и мы попробуем получить символ с индексом 0. Поставьте проверку на пустую строку в самое начало, в этом случае сразу вернётся пустая строка и основная часть метода не будет выполняться. Если поставить эту проверку в самый конец, то она действительно никогда не выполнится, так как перед ней стоит return
Большое спасибо, все заработало)
Максим Литвинов, «»»»Если поставить эту проверку в самый конец, то она действительно никогда не выполнится, так как перед ней стоит return»»» Т.е. получается, что мы должны при подобных проверках всегда булеву проверку ставить в самый конец?
Проверка на пустую строку — это пограничный случай и его, напротив, нужно ставить в самое начало функции. Чтобы пустая строка не попадала в основную часть.
Если поставить эту проверку в самый конец, то она действительно никогда не выполнится, так как перед ней стоит return
Это был ответ на этот вопрос:
Почему если я поставлю первый if с equals в конец, то Java ругается: «unreachable statement «
How to Fix Unreachable Statement Errors in Java
Introduction to Statements and Compile-time Errors in Java
Statements are foundational language constructs that have an effect on the execution of a program. Statements are similar to sentences in natural languages. In Java, there are three main types of statements, namely expression statements, declaration statements, and control-flow statements [1].
As a compiled programming language, Java has an inbuilt mechanism for preventing many source code errors from winding up in executable programs and surfacing in production environments [2]. One such error, related to statements, is the unreachable statement error.
What Causes the Unreachable Statement Error?
By performing semantic data flow analysis, the Java compiler checks that every statement is reachable and makes sure that there exists an execution path from the beginning of a constructor, method, instance initializer, or static initializer that contains the statement, to the statement itself. If it finds a statement for which there is no such path, the compiler raises the unreachable statement error [3].
Unreachable Statement Error Examples
After a branching control-flow statement
The break , continue , and return branching statements allow the flow of execution to jump to a different part of the program. The break statement allows breaking out of a loop, the continue statement skips the current iteration of a loop, and the return statement exits a method and returns the execution flow to where the method was invoked [4]. Any statement that follows immediately after a branching statement is, by default, unreachable.
After break
When the code in Fig. 1(a) is compiled, line 12 raises an unreachable statement error because the break statement exits the for loop and the successive statement cannot be executed. To address this issue, the control flow needs to be restructured and the unreachable statement removed, or moved outside the enclosing block, as shown in Fig. 1(b).
package rollbar; public class UnreachableStatementBreak < public static void main(String. args) < int[] arrayOfInts = ; int searchFor = 12; for (int integer : arrayOfInts) < if (integer == searchFor) < break; System.out.println("Found " + searchFor); >> > >
UnreachableStatementBreak.java:12: error: unreachable statement System.out.println("Found " + searchFor); ^
package rollbar; public class UnreachableStatementBreak < public static void main(String. args) < int[] arrayOfInts = ; int searchFor = 12; boolean found = false; for (int integer : arrayOfInts) < if (integer == searchFor) < found = true; break; >> if (found) < System.out.println("Found " + searchFor); >> >
Found 12
- Docs Overview
- Setting up Rollbar
- Notifications
- Deploy Tracking
- Telemetry
- Security & Compliance
- API
Ошибка unreachable statement
ошибка call to super must be first statement in constructor
Всем првет. Решил подучить джаву, начал писить примитивные проги, Соответственно детский вопрос -.

Ошибка unreachable statement
Здравствуйте! при создании простого приложения с базой данных возникла ошибка unreachable.
Unreachable code Cath statement missing ) Type name expected
Всем Салют!У меня проблема в проге.Хочу создать исключение: #include <vcl.h> #pragma hdrstop .

Нюансы синтаксиса: как работают выражения вида statement = statement = statement?
Всем привет. Что значит такое выражение в c++? c = c2 = c/2; и как вообще работают такие.
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495

Сообщение было отмечено savenkodenys как решение
Решение
Сообщение от savenkodenys 
unreachable statement
Ошибка означает недостежимый код. Подозреваю, что имеется ввиду, что строка 101 никогда не выполнится, т.к. у вас бесконечный цикл, но я не уверен, попробуйте убрать возвращаемое значение и проверьте, всё равно от него никакого толку нету.
Сообщение от savenkodenys 
И почему если обьявить переменную score без static
Потому-что не статичные переменные не доступны в не статичных методах. Статичный метод — это метод всего класса, без привязки к конкретному экземпляру(объекту), соответственно, метод класса ничего не знает о переменных своих объектов(нету ссылки на this), поэтому и ошибка. Если не понятно, то гуглите про статичные поля и методы класса.
12 / 12 / 10
Регистрация: 04.06.2017
Сообщений: 99
dalay_lama, спасибо Вам за толковый ответ. Позвольте задать еще один вопрос. Как вы возможно заметили, я пытаюсь сделать что-то типо игры на реакцию. Суть ее в том, что есть несколько (в моем случае 3 круга) кругов красного цвета. Через определенный промежуток времени (который будет постепенно уменьшаться) рандомный круг закрашывается в зеленый цвет и на него нужно кликнуть мышью. Ну вот, собственно, я пока не знаю как реализовать этот промежуток времени (в течении которого рандомно выбраный круг будет зеленым), можете подсказать? Буду очень благодарен Вам за ответ
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495

Сообщение было отмечено savenkodenys как решение
Решение
savenkodenys, а ты кстати сам пробовал запускать своё приложение? ты в курсе, что твой вечный цикл будет вешает всё твоё приложение? он будет до бесконечности создавать random и задавать circle-ам события на клик мыши, и до действий пользователя дело так и не дойдёт.
Можно конечно предположить, что так и задумано, но в таком случае, должен тебе сказать, что игра довольно жестокая.
А собственно конкретно по твоему вопросу — Timeline твоё спасение.
Короче вот, набрасал тебе пример как сделать, чтобы хотяб работало, надеюсь правильно тебя понял:
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.input.MouseEvent; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.stage.Stage; import javafx.util.Duration; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * Created by Artur on 14.07.17. */ public class YourReaction extends Application { private final static int AMOUNT_OF_CIRCLES = 3; private final static int RADIUS = 20; private static int score = 0; private VBox gamePlace; private Button btStart; private Button btStop; public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { gamePlace = new VBox(5); btStart = new Button("Start"); btStop = new Button("Stop"); btStart.setOnMousePressed(new EventHandlerMouseEvent>() { @Override public void handle(MouseEvent event) { createRoundGame(1000); } }); btStop.setOnMousePressed(new EventHandlerMouseEvent>() { @Override public void handle(MouseEvent event) { Platform.exit(); } }); createMenuGame(); Scene scene = new Scene(gamePlace, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } private void clearGamePlace() { gamePlace.getChildren().clear(); } private void createMenuGame() { clearGamePlace(); gamePlace.getChildren().addAll(btStart, btStop); } private void createRoundGame(double msWillCircleGreen) {// метод принимает, количество миллисекунд до того, как появится зелёный круг, собственно сюда и передавай свой изменяемый параметр clearGamePlace(); ListCircle> circles = new ArrayList<>(AMOUNT_OF_CIRCLES);//проще оперировать массивом кругов, чем описывать каждый отдельно for (int i = 0; i AMOUNT_OF_CIRCLES; i++) circles.add(new Circle(RADIUS, Color.RED)); Random random = new Random(); Circle circleSuccess = circles.get(random.nextInt(AMOUNT_OF_CIRCLES));//выбираем из массива только один круг рандомно, который будет окрашен в зелёный. P.S. если у тебя начисляются очки только за клик по зелёному кругу, почему у тебя в изначальном варианте обработка на клик мыши была для всех кругов, не учитывая зелёный он или нет? либо у тебя ошибка, либо я тебя не правильно понял, если что поправишь HBox hbox = new HBox(5); hbox.setAlignment(Pos.CENTER); hbox.getChildren().addAll(circles); //вот собственно место твоего вопроса, создаём объект timeline(таймер), указываем ему количество миллисекунд до того, как выполнить собственно какое-либо действие Timeline timeline = new Timeline(new KeyFrame(Duration.millis(msWillCircleGreen), new EventHandlerActionEvent>() { @Override public void handle(ActionEvent event) { //а это метод, который будет вызван, когда таймер закончится, собственно здесь и прописываем закрашивание нужного круга и обработку по клику на него circleSuccess.setOnMousePressed(new EventHandlerMouseEvent>() {//создание обработки по клику должна находиться именно здесь, иначе может произойти ситуация что пользователь кликнет по нужному кругу, до того, как он станет зелёным @Override public void handle(MouseEvent event) { score++; createMenuGame(); } }); circleSuccess.setFill(Color.GREEN);// } })); gamePlace.getChildren().add(hbox); timeline.play();//запускаем таймер } }
