Elettracompany.com

Компьютерный справочник
7 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Missing return statement java что значит

Полное включение перечисления в Java приводит к ошибке «Missing return statement»

Предположим, у нас есть оператор switch, который полностью покрывает все возможные случаи перечисления параметра, и имеет null-check тоже, не будет скомпилирована причина «Missing return statement» .

Я знаю, что выбрасывание исключения из default case или after enum, или посещение элемента enum вместо switch исправит проблему. Но я не понимаю технической причины такого поведения: очевидно, нет никакой возможной ветви исполнения, которая не приводит к return или throw . Также было бы здорово в некоторых случаях иметь проверку времени компиляции, чтобы все случаи были охвачены.

5 Ответов

Поскольку вы не написали default, компилятор автоматически добавил его в следующую строку после блока switch. В этот момент компилятор «notice», что нет точки возврата из метода и дает вам эту ошибку.

Я взял вас пример и изменил, но добавил бросок RuntimeException после переключения, например:

Я скомпилировал класс и использовал javap -c Example.class, чтобы увидеть фактический байт-код (см. ниже). Обратите внимание на «default: 52», который был добавлен javac. Это приводит к разделу блока после случая переключателя, и там я бросил RuntimeException, который перезаписывает необходимость возврата.

Компилятор не проверяет, перечислены ли все константы из Foo как блоки case , и, следовательно, вызывает и ошибку.

Предположим, что Foo был определен как:

Затем, что ваш метод вернет, если вы передадите Foo.THREE в качестве аргумента?

В качестве альтернативы подходу switch можно добавить член int в перечисление Foo и задать соответствующее число для каждой константы:

Таким образом, вам не понадобится switch , и компилятор любезно попросит вас установить соответствующее число для любой возможной новой константы Foo .

Я собираюсь сделать снимок в темноте здесь, не прочитав никакого обоснования для этого, но если это не основная причина поведения, это, по крайней мере, причина.

Предположим, что перечисление вместо этого поступает из библиотеки, от которой зависит ваш проект. В версии, которую вы компилируете, ONE и TWO являются единственными вариантами. Однако вы можете в конечном итоге работать с более поздней версией (через OSGi или другие решения), которая добавила другое значение THREE . Если THREE передается в fooToInt , он достигнет конца вашего метода, и ничего не будет возвращено (или брошено). Ой.

Это довольно неприятно обнаружить во время выполнения, поэтому вы вынуждены сделать выбор относительно того, как это будет обрабатываться, даже если это на самом деле кажется невозможным во время компиляции. Некоторые случаи, как в вашем примере, вероятно, могут быть обнаружены и разрешены для компиляции, а другие случаи могут быть обработаны по-другому (например неявное throw ), но в списке всех вещей, которые можно было бы сделать для улучшения Java, я бы не поставил это на первое место.

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

Вы пропустили блок default .

Потому что ваш метод должен возвращать некоторое значение.

Поместите return вне оператора switch. Или поставить блок по умолчанию

Похожие вопросы:

Почему это не компилируется (пробовал с java 8 и java 10)? Это приводит к отсутствию ошибки оператора return. public class CompilerIssue < public boolean run() < throwIAE(); // Missing return.

Я получаю ошибку MyPy отсутствует оператор возврата, даже когда я проверяю все возможные случаи внутри функции. Например, в следующем коде MyPy все еще дает мне ошибку 9: error: Missing return.

Попытка передать строковые данные приводит к желаемому результату в HTML, но не уверен, почему я получаю ошибку missing ; before statement. window.context_user_email =.

Я написал эту небольшую программу в качестве практики в Java(она имитирует 7 электрических логических вентилей), поскольку я в настоящее время изучаю ее. Но когда я пытаюсь скомпилировать его, он.

Я пытаюсь перенаправить все 404 ошибки с помощью действия перенаправления. В файле маршрутов я добавляю эти строки App::missing(function($exception) < Redirect::action('LoginController@getError');.

Эта функция всегда будет return foobar : /** * @return */ function foobar() < var x = true; if (x) < return 'foobar'; >> При компиляции с помощью этой команды: java -jar.

Im делает метод java для приложения android, который возвращает каталог, в котором приложение должно работать во внешнем каталоге. У меня возникли проблемы с обработкой возвратов, и я не знаю, как.

Почему компилятор выдает мне return statement missing erorr? Все возможные условные ветви (if-else) содержат оператор return. Но если у меня есть одна и та же конструкция if-else-if-else (не внутри.

Missing return statement java что значит

Hi everyone! This is the problem.
Missing return statement. Why do i have to put a return statement outside of the ‘if’ statement if there is no possible way of executing excatly that statement? Why is it an error and what is the logic in it?

In your function of «public boolean setFileName()», Compiler can able to see two statements 1) String declaration and 2) If else statements. And as your function has a valid return type other than «void», compiler try to find third statement i.e. return statement. Compiler do not know about your logic of «If-else», it knows about its semantic validation.

So, you got an error.

You can write the same function in the following manner also

Gaurangkumar Khalasi wrote: Compiler do not know about your logic of «If-else», . So, you got an error.

Not correct. The compiler knows that one of the if or the else parts must execute. And since each is terminated with a return there is no need for the extra return at the end. In fact, doing so will result in an unreachable code error.

Bear Bibeault wrote: Not correct. The compiler knows that one of the if or the else parts must execute. And since each is terminated with a return there is no need for the extra return at the end. In fact, doing so will result in an unreachable code error.

Sorry, my mistake

Gaurangkumar Khalasi wrote: In your function of «public boolean setFileName()», Compiler can able to see two statements 1) String declaration and 2) If else statements. And as your function has a valid return type other than «void», compiler try to find third statement i.e. return statement. Compiler do not know about your logic of «If-else», it knows about its semantic validation.

Читать еще:  Console log javascript

So, you got an error.

Gaurang, I will beg to differ here. The compiler knows that if ‘if-else’ statements are present, then one has to be executed and if each has a return statement then there is no need for the return statement outside if-else block.

In case, where you use only if statement, then you will need that extra return statement outside the if-block because in that case compiler doesn’t know whether that if statement will actually be executed.

I apologize. I didn’t read it before i posted but now i did and hope it fits.
Before i posted, i googled the web for ‘missing return statement’ and ‘missing return statement in if clause’ but did not find anything.
Afterwords, i searched the web more thoroughly and found the solution.
The problem was that, if the first ‘if’ statement is to be executed, then there is no need for ‘else’ beacuse it executes anyway which is logical but,
if i decide to put an ‘else’ just to make it clearer, what do i put as a return type for the third solution? I found ERROR but it looks ackward.
Is there a workaround to this?

Thank you for the answers

On the other hand, this works. Is inheritance the problem? But why would it be?

Thank you for your answers.

Inheritance? of course not.

It works because there are only two path through the method and each is terminated with a return. Any method that has a path that does not result in a return will be in error.

Mario Skrlec wrote: I apologize. I didn’t read it before i posted but now i did and hope it fits.

No probs. Thanks for taking the time.

missing return statement

i_me_roo Newbie Poster

Im trying to compile this class below, but its just not working, it keeps sating ‘missing return statement’ int the method declaration line. Can u see to check if there is anything missing in my code or if iv done something wrong??

  • 11 Contributors
  • forum12 Replies
  • 776 Views
  • 6 Years Discussion Span
  • commentLatest Post 9 Years Ago by jon.kiparsky

freesoft_2000 9

hello everyone,
Your class main is missing and you added an extra bracket at the end

cosi 4

Well I’m sure that i_me_roo probably has a main and extra bracket at the end. The compiler complaint was about return statements.

i_me_roo if you look at the code, you’ll see that it is possible to go straight through the function without hitting the return statement. This is what the compiler is complaining about. The function returns an int, so all paths of execution must have a return value;

My suggestion is to have a ‘return ERROR’, or ‘return 0’, or ‘return -1’ after the for loops if you never intend to reach that line of execution. This is the best advice I can think of since I have no idea about the context of the function you wrote.

nanosani 20

Now it’ll run well.

i_me_roo

Thank you very much for ur help all of u, it is working now!! Thanks!

JRabbit2307

hi everyone i’m new to programming and i have to say its fun and frustrating at the same time could anyone help me fix this??

javaAddict 900

hi everyone i’m new to programming and i have to say its fun and frustrating at the same time could anyone help me fix this??

This is a 5 year old thread. That were you thinking posting here? Do you random peek threads and start writing irrelevant things in them?

If it says it is missing a return statement, then add one since your method is declared to return a String.
If you have any more questions start a new thread.

ithelp 757

hi everyone i’m new to programming and i have to say its fun and frustrating at the same time could anyone help me fix this??

You need to make a string out of the integer total and return it

ramhota

i have the same problem! missing return statement

javaAddict 900

i have the same problem! missing return statement

Did you bother to read the rest of the thread with the answers. You resurrected an old thread just to post a question that has already been answered? Are you too lazy to read the suggestions and advices given and you want some one just to tell you again the answer, instead of you spending 5 minutes to read the rest of the thread?

If it says «missing return statement» then you haven’t put a «return» statement. Why you should put one? Read the rest of the thread.
Also, the errors that you get tell you exactly where the error is at your code. Read those errors.

stultuske 1,092

that’s because your class is filled with errors. you are telling the compiler that you are returning an int, both in getOrder() and displayOrders(), but you have no return statement, nor do you have a variable in which you store the value in your main method, or a print in which the value is shown.

next to that: if you would’ve looked at the post you’re answering to, you would’ve seen it’s a post that dates back to 2004. There is no use what so ever to revive this thread. if you have a question, just create a new thread.

and since I’ve answered your question in my first paragraph, and give you enough info to correct your code, there is no need to create another thread with this question.

Pengi18

this is for a class and it is saying that I am missing a return statement. I am hoping that you will have some ideas. I have read the thread, but I am still confused on how to fix it

Читать еще:  Double compare java

jon.kiparsky 326

I will be happy to explain the answer — your confusion here is actually reasonable — if you’ll be kind enough to
a)start a new thread for this question, since we don’t like new questions in old threads, it’s contrary to the house style
and
b) put code tags around your code, so it comes out formatted legibly.

Класс Statement

Statement используется для выполнения SQL-запросов. Существует три типа класса Statement, которые являются как бы контейнерами для выполнения SQL-выражений через установленное соединение:

  • Statement, базовый;
  • PreparedStatement, наследующий от Statement;
  • CallableStatement, наследующий от PreparedStatement.

Все классы специализируются для выполнения различных типов запросов:

  • Statement предназначен для выполнения простых SQL-запросов без параметров; содержит базовые методы для выполнения запросов и извлечения результатов.
  • PreparedStatement используется для выполнения SQL-запросов с или без входных параметров; добавляет методы управления входными параметрами.
  • CallableStatement используется для вызовов хранимых процедур; добавляет методы для манипуляции выходными параметрами.

Создание объектов Statement

После установления соединения Connection с базой данных, оно может использоваться для выполнения SQL-запросов. Объект Statement создается методом Connection.createStatement.

Пример :

Для отправки серверу БД SQL-выражения для выполнения необходимо вызвать метод executeQuery объекта Statement и в качестве аргумента передать скрипт запроса :

Методы Statement : executeQuery, executeUpdate, execute

Класс Statement содержит три различных метода выполнения SQL-выражений : executeQuery, executeUpdate и execute, которые вызываются в зависимости от текста SQL-запроса.

executeQuery

Метод executeQuery используется в запросах, результатом которых является один единственный набор значений, таких как запросов типа SELECT.

executeUpdate

Метод executeUpdate следует использовать, как для выполнения операторов управления данными типа INSERT, UPDATE или DELETE (DML — Data Manipulation Language), так и для операторов определения структуры базы данных CREATE TABLE, DROP TABLE (DDL — Data Definition Language).

Результатом выполнения операторов INSERT, UPDATE, или DELETE является изменения одной или более строк таблицы.

Результатом выполнения метода executeUpdate является целочисленное значение, определяющее, сколько строк было модифицировано. Для выражений DML, которые не оперируют со строками, возвращаемое методом executeUpdate значение всегда равно нулю.

execute

Метод execute используется, когда операторы SQL возвращают более одного набора данных, более одного счетчика обновлений или и то, и другое. Такая возможность редко используется программистами.

Объекты Statement сами по себе не «помнят» SQL-выражение. Оно передается в качестве аргумента методов Statement.executeXXX.

Необходимо отметить, что PreparedStatement, наследующий все методы Statement, имеет свои реализации методов executeQuery, executeUpdate и execute. Объекты PreparedStatement не принимают SQL-выражения в виде аргументов этих методов, так как они уже содержат прекомпилированные SQL-выражения.

CallableStatement наследуют методы от PreparedStatement без параметров. Использование аргументов в методах executeXXX объектов PreparedStatement и CallableStatement приведет к генерации ошибки SQLException.

Объекты Statement закрываются автоматически сборщиком мусора виртуальной машины Java. Тем не менее рекомендуется закрывать их явно после того, как работа с ними завершена. Закрытие объектов Statement после их использования освобождает ресурсы СУБД и позволяет избежать проблем с памятью.

Завершение выполнения запросов

Объект Statement считается завершенным (complete), если он выполнился и все его результаты были возвращены.

Для метода executeQuery, возвращающий набор данных, оператор считается завершенным, если считаны все строки соответствующего объекта ResultSet. В случае использования метода executeUpdate объект завершен сразу же после выполнения метода.

В случае вызова метода execute оператор остается не завершенным до тех пор, пока все наборы данных не будут считаны.

Использование PreparedStatement

PreparedStatement предварительно компилирует запросы, которые могут содержать входные параметры обозначенные символом ‘?’

Пример использования PreparedStatement

Использование CallableStatement

Объект CallableStatement предоставляет унифицированный способ вызова хранимых процедур в СУБД. Вызов процедуры осуществляется с результирующим параметром и без него. Результирующий параметр — это один из типов выходных (OUT) параметров, являющийся возвращаемым значением хранимой процедуры.

Синтаксис вызова хранимой процедуры в JDBC показан ниже. Квадратные скобки означают, что то, что находится между ними, необязательно, и сами по себе не являются частью синтаксиса.

Первые две формы могут иметь переменное число аргументов на входе (параметры IN), выходе (параметры OUT) или входных и выходных параметров одновременно (INOUT-параметры). Вопросительный знак означает местоположение параметра.

Метод supportsStoredProcedures() класса DatabaseMetaData позволяет узнать, поддерживает СУБД хранимые процедуры или нет.

Создание объекта CallableStatement

Объекты CallableStatement создаются методом prepareCall объекта Connection. Пример, который создает экземпляр CallableStatement, содержащий вызов хранимой процедуры setGoodsData с двумя аргументами и без возвращаемого параметра:

Какими именно параметрами (IN, OUT или INOUT) являются знаки вопроса — зависит от самой хранимой процедуры setGoodsData.

Входные и выходные IN- и OUT-параметры

Передача значений входных парметров объекта CallableStatement осуществляется с помощью методов setXXX, унаследованных от PreparedStatement. Типы передаваемых значений определяются тем, какой из методов setXXX используется (setString для передачи значений типа String, setInt для передачи значений типа int и т.п.).

JDBC-типы всех OUT-параметров хранимых процедур должны быть зарегистрирваны перед их вызовом. Регистрация типов данных выходного параметра производится методом registerOutParameter. Только в этом случае после вызова хранимой процедуры CallableStatement.executeQuery() можно получить результаты выполнения с помощью методов getXXX. Необходимо использовать подходящий по типу данных Java метод getXXX в соответствии с зарегистрированным JDBC-типом параметра. Другими словами, registerOutParameter использует JDBC-тип, который подходит к JDBC-типу возвращаемого из значения, а getXXX преобразует его в тип Java.

Пример регистрации выходных параметров хранимой процедуры и чтение выходных значений. В примере метод getByte извлекает байт из первого выходного параметра, а getBigDecimal возвращает объект BigDecimal (с двумя цифрами после десятичной точки) из второго выходного параметра :

Чтение выходных параметров

В связи с ограничениями некоторых СУБД для большей совместимости рекомендуется сначала считывать результаты, сгенерированные вызовом CallableStatement, а затем выходные (OUT) параметры.

Если объект CallableStatement возвращает несколько объектов ResultSet (с использованием метода execute), то ВСЕ результаты должны быть прочитаны перед первым обращением к выходным параметрам. В этом случае для того, чтобы прочитать все результаты, надо последовательно вызывать методы Statement getResultSet, getUpdateCount и getMoreResults до тех пор, пока не останется больше результатов. После этого значения выходных параметров могут быть извлечены спомощью методов CallableStatement.getXXX.

Нулевое значение в выходных параметрах, wasNull

Возращаемое значение в выходном параметре может быть NULL. При этом методы getXXX возвращают null, 0 или false, в зависимости от типа данных.

Как и в случае с ResultSet, единственным способом узнать, вернула ли процедура 0, false или NULL, является вызов метода wasNull, который возвращает true, если последнее значение, считанное одним из методов getXXX был NULL, и false иначе.

Читать еще:  Код ошибки msvcr100 dll

Входные/выходные параметры INOUT

Если параметр является одновременно и входным, и выходным (INOUT), то необходимо вызывать как метод setXXX, так и метод registerOutParameter. Метод setXXX устанавливает входное значение параметра, а registerOutParameter регистрирует тип выходного значения.

Типы входного и выходного значений, зарегистрированных методом registerOutParameter, должны быть одинаковыми. Для чтения выходного значения используется соответствующий метод getXXX. Например, для параметра типа byte нужно использовать метод установки значения setByte, передавать JDBC-тип данных TINYINT методу registerOutParameter и использовать getByte для чтения выходного значения.

В следующий пример демонстрирует вызов хранимой процедуры rebuildTotal с одним INOUT-параметром. Метод setByte устанавливает значение параметра в 25, которое будет передано хранимой процедуре базе данных как TINYINT. Далее метод registerOutParameter регистрирует 1-ый параметр как TINYINT. После выполнения хранимой процедуры возвращается значение типа TINYINT, которое будет считано методом getByte в виде типа byte языка Java.

Если хранимая процедура оформлена функцией, т.е возвращает значение не через параметры, а через оператор «RETURNS», то для вызова используйте «execute» вместо «executeUpdate».

В отличие от ResultSet, CallableStatement не может считывать большие значения последовательно (в потоке)..

Escape-последовательности в запросах Statement

SQL-выражения Statement‘ов могут включать escape-последовательности, которые сигнализирует о том, что код выражения должен обрабатываться особо. Escape-последовательности заменяются кодом, специфичным для данной СУБД. Escape-синтаксис независит от типа СУБД

Cинтаксис escape-последовательности

Escape-конструкция заключается в фигурные скобки, где определяется ключевое слово и параметры :

Ключевое слово индицирует вид Escape-конструкции.

1. escape-последовательность с символом

Операция SQL типа LIKE использует шаблонные символы «%» и «_», которые используются для извлечения информации с определенными символами. Чтобы эти символы интерпретировались в SQL-выражении без изменений, необходимо перед ними установить обратный символ слэша «». Этот специальный символ и называется escape-символом.

Можно явно определить, какой именно из символов использовать в качестве escape-символа, если в конце запроса ввести следующую конструкцию:

В следующем коде осуществляется чтение строки, начинающейся со знака подчеркивания:

2. escape-последовательность с функциией fn

Практически во всех СУБД есть функции для манипуляции с числами, строками, временем, датой. Эти функции могут использоваться в escape-конструкции с ключевым словом fn, именем функции и ее аргументами. Следующий пример вызывает функцию конкатенации concat с двумя аргументами:

Имя текущего пользователя БД может быть извлечено с помощью следующего вызова:

Скалярные функции могут поддерживаться различными СУБД с немного отличающимся синтаксисом, а некоторыми СУБД могут и не поддерживаться вовсе.

Для получения списка поддерживаемых СУБД функций можно использовать класс чтения метаданных DatabaseMetaData, у которого метод getNumericFunctions возвращает список имен числовых функций, разделенных запятой, а метод getStringFunctions возвращает строковые функции, и т.д.

3. escape-последовательность для работы с датой и временам

Различные СУБД отличаются форматом записи и чтения даты, времени и временного штампа, включающего дату и время (timestamp).

Формат использование escape-последовательности даты следующий:

где yyyy — это год, mm — месяц, и dd — день. Например, следующая последовательность будет заменена строкой ’28- FEB-15′, если СУБД воспринимает именно такой формат даты.

Аналогичным образом обрабатываются escape-конструкции для типов данных TIME и TIMESTAMP:

Милисекунда (.ms) в TIMESTAMP может быть опущена.

4. escape-последовательность с хранимыми процедурами

Для обращения к хранимой процедуры из JDBC используется либо call, либо ? = call.

Если СУБД поддерживает хранимые процедуры, то они могут вызываться из JDBC с помощью следующего синтаксиса escape-последовательности:

Missing return statement java что значит

В предыдущей статье мы только познакомились с JDBC и написали простое приложение, которое позволило нам соединиться с СУБД и получить данные с помощью SQL-запроса. Хоть программа и не очень сложная, но на мой взгляд, мы сделали весьма важный шаг — мы смогли соединиться с базой данных и сделать пусть и простой, но запрос. Все, что мы рассмотрим дальше — это уже более удобные и более профессиональные способы использования JDBC.

Запросы на получение данных и запросы на обновление

SQL-запросы можно условно разделить на две группы:

  1. Получение данных — к ним относится оператор SELECT
  2. Изменение данных — к ним относятся операторы INSERT, UPDATE и DELETE

Для первой группы используется уже знакомый нам метод интерфейса StatementexecuteQuery(). В принципе для начала этого метода вполне достаточно. Он покрывает очень большой процент запросов, которые разрабатываются для реальных систем. Позже мы познакомимся с дополнительными возможностями, но на данных момент советую запомнить — если надо получить данные из таблицы, то executeQuery в подавляющем большинстве случаев будет самым правильным выбором.
Для второй группа запросов (опять же в большинстве случаев) может использоваться другой метод интерфейса StatementexecuteUpdate(). Есл посмотреть документацию, то в отличии от executeQuery() (который возвращает ResultSet) этот метод возвращает целое число, которое говорит сколько строк в таблице было изменено при исполнении вашего запроса.
Например, вы можете оператором DELETE FROM JC_CONTACT удалить ВСЕ строки (посему будьте очень аккуратны). В этом случае метод executeUpdate() вернет количество удаленных строк. В некоторых ситуациях знание о количестве измененных строк бывает удобным для построения алгоритмов работы с данными.
В принципе с этим вопросов можно закончить — главное мы уже увидели. Для выборки данных — executeQuery(). Для изменения данных — executeUpdate().

Разновидности Statement

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

Возникает вполне резонный вопрос — а зачем эти интерфейсы нужны ? Давайте разбираться. Для начала мы рассмотрим интерфейс PreparedStatement и другие возможности JDBC. К интерфейсу CallableStatement обратимся позже — его использование во-первых не так часто встречается, и во-вторых — после всего рассмотренного, про него разговор уже можно делать достаточно коротким.

PreparedStatement

Если честно перевести название, то можно получить что-то вроде «подготовленный оператор». Самым важным здесь является слово «подготовленный». В чем же заключается «подготовленность» ?
Прежде чем мы рассмотрим этот вопрос, предлагаю увидеть достаточно важный с точки зрения удобства момент, который возникает очень часто. Итак, в каком-либо приложении нам надо вставить данные о контакте в таблицу JC_CONTACT. Для этого нам надо подготовить запрос наподобие такого:

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector