2011-08-31 7 views
9

Я пытаюсь скомпилировать свой код без ошибок и никаких предупреждений в качестве стандартной практики. Однако есть одно раздражающее предупреждение, что я знаю, как работать в .NET, но не на Java. Скажем, у меня есть блок кода, как это:Предупреждение об ошибке блокировки блоков в Java

try { 
     FileInputStream in = new FileInputStream(filename); 
     return new Scanner(in).useDelimiter("\\A").next(); 
    } catch (FileNotFoundException ex) { 
     LOG.log(Level.SEVERE, "Unable to load file: {0}", filename); 
     return null; 
    } 

я получаю предупреждение, что переменная ex не используется. Теперь у меня нет никакой пользы для ex, я не хочу ex, но я не знаю, что с этим делать. В .NET я мог бы просто сделать:

catch (FileNotFoundException) 

без переменной и она будет скомпилирована и запущена без ошибок.

Как можно справиться с этой ситуацией на Java? Я знаю, что могу сделать локальную переменную и установить ее на ex, но это кажется глупым и расточительным обходным решением, чтобы исправить предупреждение, которое действительно не нужно.

+1

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

ответ

6

Существует нет чистого способа «пометить ex как используется» на Java, кроме как с его помощью.

Заметим, однако, что в соответствии с its documentationFileNotFoundException также может быть брошен, когда «[...] файл не существует, но по какой-то причине недоступен , например, при попытке открыть только для чтения файл для записи ".

Поэтому я предлагаю вам do использовать исключение, также распечатывая сообщение из исключения.

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

+0

Я отмечаю это как лучший ответ, потому что он наиболее непосредственно ответил на мой вопрос в первом предложении. – Sheridan

+0

«также печатающее сообщение из исключения», это использование текста исключения ('toString()') в качестве элемента пользовательского интерфейса. Я бы сказал, что это была плохая идея: текст не интернационализирован и часто имеет форму, предназначенную для программистов, а не для пользователей. – Raedwald

+0

Дополнительные мысли о том, следует ли использовать сообщение из исключения: http://stackoverflow.com/questions/7320080/should-you-report-the-message-text-of-exceptions – Raedwald

11

Log исключение. Это всегда полезно, когда преследует ошибку.

+1

Согласен: зная, почему файл не был найден, всегда может быть полезным. Вы можете зарегистрировать исключение с точным или лучшим уровнем. – Matteo

+3

Настоятельно соглашайтесь, сделайте себе одолжение и «LOG.log (Level.SEVERE,« Невозможно загрузить файл: »+ имя файла, ex);'. –

+0

Он регистрирует исключение. Его проблема - ложное предупреждение от компилятора. – Raedwald

1

Если я скомпилирую этот код с помощью javac, я не получаю предупреждение, так что либо вы используете другой компилятор, либо разные настройки. Я предполагаю, что IDE используется со специальными настройками для неиспользуемых переменных.

В затмении я включаю такие предупреждения с аннотациями, в данном случае: @SuppressWarnings ("unused") в строке перед.

+0

У него нет ошибки, он получает предупреждение. – Paul

+0

Вы правы, я исправил это, потому что в командной строке я не получил предупреждения. Меня смутило его предложение «В .NET я мог просто сделать: ... catch (FileNotFoundException) ... без переменной, и он будет компилироваться и запускаться без ошибок.», Но в других местах он ясно говорит о предупреждения. –

0

Необходимо зарегистрировать исключение. Согласно API FileInputStream, FileNotFoundException может быть выброшен «если файл не существует, является каталогом, а не обычным файлом или по какой-либо другой причине не может быть открыт для чтения». Если вы столкнулись с этой проблемой, более подробное описание вашего файла журнала (например, трассировка стека) упростит его исправление.

2

Предупреждение является предупреждением IDE, вы должны иметь возможность отключить его.

Однако есть много причин, по которым может быть выбрано FileNotFoundException, в этом случае вы захотите узнать причину.

IntelliJ распознает ignore или ignored как преднамеренно проигнорированное исключение или непустой блок блокировки в зависимости от вашей настройки.

3

В принципе, вы являетесь SOL (вы должны объявить переменную и вставить предупреждение), потому что JAVA немного маниакально-депрессивный или, по крайней мере, nanny-ish, в своем подходе к разработчику; это еще один пример. JAVA заставляет вас объявлять переменную catch, даже если вы никогда не собираетесь ее использовать. Это означает, что у вас есть неиспользованная переменная, лежащая рядом, просто ожидая возникновения проблемы. Хотя было много комментариев о том, что «вам нужно работать с этой переменной исключения», эти комментарии не совпадают с точкой вопроса. Вопрос в том, «как мне не получить это предупреждение о неиспользуемых переменных», в примере используется исключение FileNotFound, но это может быть любое исключение. Речь шла не об исключении FileNotFound, а о предупреждении неиспользуемой переменной.

Тип исключения не имеет значения для этого вопроса. Например, у меня есть класс, который управляет буферами данных. Он может генерировать исключение по нескольким причинам, одним из которых является заполненный буфер данных. Поэтому, если я попытаюсь поместить данные в полный буфер, моя функция может получить это исключение. Это единственное исключение, которое он может получить в этой ситуации. Одна из функций, которая использует этот класс, определяет исключение и расширяет буфер. Он не заботится об переменной исключения, не регистрирует исключение, обрабатывает исключение и переходит. Вместо исключения я могу вернуть флаг, указывающий, что буфер заполнен, но побеждает система обработки исключений (в системе есть другие процедуры, в которых это исключение является ошибкой, и я обрабатываю их с протоколированием и сообщениями пользователю и т. д.)

Итак, я могу установить IDE, чтобы игнорировать предупреждение неиспользуемой переменной. Но это не очень хорошая идея, потому что бывают случаи, когда использование переменной не указывает на реальную проблему (я пропустил фрагмент кода или, может быть, забыл закончить комментарий блока или что-то еще). Или, как минимум, у меня есть кусок неиспользуемого кода, который может добавить путаницу в будущем. Я мог бы подавить предупреждение, но это всего лишь клочья. Суть в том, что я должен ввести неиспользованную переменную, документ, почему она не используется, и отложить работу, чтобы подавить предупреждение (поэтому QA не жалуется), потому что JAVA хочет защитить меня от себя.

<rant> 

Здесь у меня есть большая проблема с JAVA. JAVA утверждает, что они являются серьезным языком программирования для серьезных профессионалов для использования в серьезных проектах. Тем не менее, они затем делают предположение, что эти самые серьезные профессионалы всегда делают глупые ошибки, и им нужно защищаться от этих ошибок. Это почти похоже на говорящих хирургов, что они не могут использовать скальпель, потому что они могут срезать себя. Если вы создаете игрушечный язык программирования для любителей, тогда установите все необходимые вам защиты. Но, если вы требуете сделать язык для профессионалов, тогда дайте профессионалам инструменты, необходимые им для выполнения своей работы. Они профессионалы, дают им профессиональные инструменты. Такие вещи, как форсирование определения неиспользуемой переменной, не позволяющие перегрузкам оператора, не имеющие неподписанных примитивов и в основном рассматривающие классы пользователей, поскольку граждане второго сорта ограничивают набор инструментов и указывают на то, что профессиональные инженеры не все профессионалы. Я не против предупреждений - они помогают процессу разработки быстрее. Мне не нравится отсутствие полного набора инструментов. Это заставляет работать вокруг, kludges и целый новый источник ошибок.

Во всяком случае, извините за громкие слова

</rant> 
Смежные вопросы