#java #eclipse #java-16
#java #eclipse #java-16
Вопрос:
В настоящее время я пытаюсь работать с изображениями, в частности конвертировать изображения из форм JPEG, WEBP и BMP в формы PNG, и мой метод использует javax.imageio.ImageIO
класс. Когда я попытался импортировать его, Eclipse закричал, что пакет этого типа недоступен. Я подумал, что это странно, и самостоятельно покопался в StackOverflow и нашел несколько ответов, в которых говорилось, что я должен удалить и повторно добавить JRE. Это не сработало, что неудивительно, но, просматривая мой путь сборки, я заметил, что в JRE отсутствует весь пакет javax. Есть ли причина, по которой это может быть? Есть ли исправление?
Точная ошибка считывается The type javax.imageio.ImageIO is not accessible
, и предлагаемые изменения спрашивают меня, хочу ли я создать класс ImageIO
в пакете javax.imageio
.
Я использую последнюю сборку Eclipse. Мой JDK есть java-16-openjdk-amd64
. Я использую Ubuntu 20.04. Я создал это приложение с нуля, поэтому я не использую Maven (если только Eclipse не использует Maven по умолчанию).
Я попытался скомпилировать базовый класс в своей командной строке, и по какой-то причине он сработал, несмотря на то, что не работал в Eclipse.
Я бы предпочел не возвращать свой JDK к более старой версии, если мне это не нужно.
Комментарии:
1. В
javax.imagio.ImageIO
вашем вопросе опечатка? Пакет javax.imageio (обратите внимание наe
).2. # 1 Использует ли ваше приложение maven? # 2 Не могли бы вы поделиться с нами скриншотом ошибки eclipse? # 3 Не могли бы вы собрать и запустить его с помощью нашей оболочки, чтобы проверить, является ли это ошибкой в вашем коде?
3. Используете ли вы модули?
4. @nitind
module-info.java
принадлежит корню исходного каталога, а не пакету.5. Даже без модулей Eclipse поддерживает ограничение API, которые может использовать код проекта, но это вряд ли будет настроено без ведома разработчика. Можете ли вы увидеть класс в проводнике пакетов?
Ответ №1:
Оказывается, я был просто идиотом. Оказывается, я действительно сделал это с помощью модуля, не осознавая этого. Все, что мне потребовалось, это избавиться от файла модуля.
Ответ №2:
Вы не вызываете «new» для статического класса, чтобы сделать его экземпляр нестатическим, если у него когда-либо есть такой тип, доступный из одного из его статических методов, которые вы приводите к этому типу. Однако с javax.imageio.ImageIO you make other classes from its methods
.
import java.awt.image.BufferedImage;
import java.io.*;
try{ // wrap in FileNotFoundException IOException
File input = new File("/somewhere/over/the/rainbow/cementplant.jpg");
//static classes are called directly with a method
BufferedImage bfi = (BufferedImage)javax.imageio.ImageIO.read(input);
Комментарии:
1. Я никогда не говорил, что создаю новые объекты ImageIO. Я не создаю новые объекты ImageIO.
2. Похоже, вы не понимаете, какие статические классы есть в Java, потому что вы определенно можете (и, в зависимости от контекста, должны) создавать их. Используете ли вы new или нет, зависит не от того, является ли класс статическим, а от того, доступен ли его конструктор вашему коду. Кроме того,
ImageIO
это даже не статический класс.3. Хотя каждый статический класс загружается машиной как новый, существует только одна копия. статические классы также инкапсулируются во ВНЕШНИЙ класс, который иногда может вызываться как новый, но НИКОГДА НЕ статический класс (за исключением, может быть, как загрузить внутренний статический класс с отражением, но последнее остается выбором интерпретации JVM методов отражения). Нет, они не вызываются с помощью «new».