Nano Hash - криптовалюты, майнинг, программирование

Есть ли стандартная аннотация для обозначения семантики nothrow в Java?

Я хотел бы задокументировать метод интерфейса в Java как не разрешенный для распространения исключений и провести какой-то статический анализ, подтверждающий, что реализации этого метода перехватывают и обрабатывают любые исключения, которые могли распространяться на него. Что-то вроде @NoThrow.

Например, я хотел бы иметь возможность написать:

interface SomeServiceProviderInterface {
   @NoThrow
   @NonNull
   SomeResult someComputation();
}

... и иметь некоторую гарантию того, что реализации подчиняются этому контракту интерфейса. Есть ли инструмент аннотации и статического анализа, который уже делает это? Если нет, то знает ли кто-нибудь, достижимо ли это с помощью процессора аннотаций (может ли он видеть, включает ли код блок try...catch?) и/или есть какие-либо указатели или советы о том, как реализовать такую ​​вещь? Спасибо!


  • Я сомневаюсь, что вы можете сделать это иначе, чем путем перехвата Throwable с пустым блоком catch или рядом с ним, поскольку любой значимый код в блоке catch будет создавать объекты, что может привести к выдаче OutOfMemoryError. Это также, вероятно, неправильный поступок. Некоторые выбрасываемые объекты, такие как объекты Error и некоторые объекты RuntimeException, действительно спроектированы таким образом, чтобы их никогда не перехватывали. 03.09.2015
  • @WarrenDew хорошо, ради аргумента предположим, что это действительно что-то вроде @ThrowsOnly(Error.class), где могут быть выброшены серьезные ошибки, такие как Error (и OutOfMemoryError), но я хочу гарантировать, что подклассы не распространяют тип Exception. .. любые идеи о том, как это может быть реализовано? В этом конкретном контексте я действительно хочу это сделать. 03.09.2015
  • Просто не указывая предложение throws в сигнатуре функции, реализациям не будет разрешено генерировать проверенные исключения. 03.09.2015
  • Кроме того, вы, вероятно, могли бы написать аннотацию, которая исследовала бы тело функции и проверила, что не было создано никаких исключений, и, возможно, проверила бы отсутствие возможности исключения нулевого указателя, а также проверила бы, чтобы все вызванные функции также имели ту же аннотацию , таким образом проверяя их рекурсивно. Я сомневаюсь в полезности, поскольку тогда вы не сможете использовать какие-либо библиотеки. Возможно, более полезным было бы изменить ваш интерфейс на абстрактный класс и просто поместить все тело функции в блок try/catch. 03.09.2015
  • @WarrenDew Статическое знание того, что метод не генерирует исключений, может быть очень ценным. Это может значительно упростить код вызова и повлиять на стратегии обработки исключений. Отсутствие предложения throws, очевидно, не является решением, так как оно по-прежнему разрешает RuntimeException. Я предлагаю вам взглянуть на ключевое слово C++ noexcept, которое стало результатом десятилетних исследований обработки исключений. Существуют существуют языковые различия, но многие из аргументов C++ применимы к Java. Некоторые даже больше, потому что безопасность исключений Java, try-finally/try-with-resources, намного слабее, чем RAII. 17.12.2015
  • Я думаю, что правильный способ реализовать это состоит не в том, чтобы проверять это с помощью аннотации во время выполнения, а в том, чтобы иметь аннотации, указывающие на ваши намерения, и иметь инструмент статического анализа, подтверждающий это утверждение. Так же, как @NonNull реализовано в Eclipse/IntelliJ. 25.03.2016

Ответы:


1

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

16.09.2019

2

Неудовлетворительный ответ

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

И, конечно же, чтобы пропустить невыполнимое вычисление вместо того, чтобы всплывать нули, есть подпрограммы.

Таким образом, этот вопрос находится на уровне избегания многих операторов if для облегчения тестирования (поскольку в противном случае непроверенные участки кода могут быть похоронены в потоке управления кодом).

Много усилий потребует сканирование классов для импорта классов исключений и опасных вызовов (Integer.parseInt). От некоторых из них анализаторы кода уже предупреждают.

Я предполагаю, что try {...} catch (Throwable/RuntimeException e) {} предназначен только для некоторых устаревших случаев. Там тоже поможет АОП.

лучшей альтернативой будет интеграция исключений. Существуют оценочные библиотеки (я не помню их названий — возможно, они относятся к продолжениям), которые могут обрабатывать исключения и обрабатывать смешанные результаты. Немного похоже на то, что сейчас делают Streams, где исключения обрабатываются частично асинхронно и тому подобное.

16.09.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..