интерфейс находящийся в пакете не видит созданное исключение
Делаю тестовые примеры по книге Шилдт. Java для начинающих, последующие примеры часто опираются на предыдущие. В одном из предыдущих примеров создавался пакет, в котором создавался интерфейс. Сейчас создаю класс без пакета, в нем используется этот интерфейс и описано, что в интерфейс надо указать создаваемые исключения. Но IDEA и компилятор говорят что эти исключения не доступны для данного интерфейса.
Пробовал перенести интерфейс из пакета в текущий проект - все начинает работать, но "ломается" пакет и класс из проекта, завязанный на пакете.
Как интерфейсу в пакете дать видимость создаваемых мною исключений?
import qpack.ICharQ;
/**
* Упражнение 9.1 добавление обрабочиков исключений в класс очереди
*/
//Исключения указывающие на переполнение очереди
class QueueFullException extends Exception {
int size;
QueueFullException(int s) {
s = size;
}
public String toString() {
return "\nОчередь заполнена. Максимальный рамер очереди " + size;
}
}
//Исключение указывающее на исчерпание очерди
class QueueEmptyException extends Exception {
public String toString() {
return "\nОчередь пуста.";
}
}
class FixedQueue implements ICharQ {
private char q[]; //массив для хранения элементов очереди
private int putloc, getloc; //индексы вставляемых и извлекаемых элементов
//создать пустую очередь заданного массива
public FixedQueue(int size) {
q = new char[size + 1];
putloc = getloc = 0;
}
//поместить символ в очередь
public void put(char ch)
throws QueueFullException {
if (putloc == q.length - 1) {
throw new QueueFullException(q.length - 1);
}
putloc++;
if (putloc == q.length) putloc = 0;//перейти в начало массива
q[putloc] = ch;
}
//извлечь символ из очереди
public char get()
throws QueueEmptyException {
if (getloc == putloc) {
throw new QueueEmptyException();
}
getloc++;
if (getloc == q.length) getloc = 0;//вернуться в начало очереди
return q[getloc];
}
}
public class QExcDemo {
public static void main(String[] args) {
FixedQueue q = new FixedQueue(10);
char ch;
int i;
try {
//переполнение очереди
for (i = 0; i < 11; i++) {
System.out.print("Попытка сохранения: " + (char) +('A' + i));
q.put((char) +('A' + i));
System.out.println("Ok");
}
System.out.println();
} catch (QueueFullException exc) {
System.out.println(exc);
}
try {
//попытка извлеч символ из пустой очереди
for (i = 0; i < 11; i++) {
System.out.print("Получение очередного символа: ");
ch = q.get();
System.out.println(ch);
}
} catch (QueueEmptyException exc) {
System.out.println(exc);
}
}
}
import qpack.*;
class IQDemo {
public static void main(String[] args) {
FixedQueue q1 = new FixedQueue(10);
DynQueue q2 = new DynQueue(5);
CircularQueue q3 = new CircularQueue(10);
ICharQ iQ;
char ch;
int i;
iQ = q1;
//поместить ряд символов в очередь с фиксированным размером
for (i = 0; i < 10; i++)
iQ.put((char) ('A' + i));
//отобразить содержимое фиксированным очереди
System.out.print("Содержимое фиксированной очереди: ");
for (i = 0; i < 10; i++) {
ch = iQ.get();
System.out.print(ch);
}
System.out.println();
iQ = q2;
//поместить ряд символов в динамическую очередь
for (i = 0; i < 10; i++) {
iQ.put((char) ('Z' - i));
}
//отобразить содержимое динамическую очереди
System.out.print("Содержимое динамической очереди: ");
for (i = 0; i < 10; i++) {
ch = iQ.get();
System.out.print(ch);
}
System.out.println();
iQ = q3;
//поместить ряд символов в кольцевую очередь
for (i = 0; i < 10; i++)
iQ.put((char) ('A' + i));
//отобразить содержимое кольцевой очереди
System.out.print("Содержимое кольцевой очереди: ");
for (i = 0; i < 10; i++) {
ch = iQ.get();
System.out.print(ch);
}
System.out.println();
//поместить больше символов в кольцевую очередь
for (i = 10; i < 20; i++)
iQ.put((char) ('A' + i));
//отобразить содержимое очереди
System.out.print("Содержимое кольцевой очереди: ");
for (i = 0; i < 10; i++) {
ch = iQ.get();
System.out.print(ch);
}
System.out.println("\nСохранение и использованиие данных кольцевой очереди");
//поместить символы в кольцевую очередь и извлечь их оттуда
for (i = 0; i < 20; i++) {
iQ.put((char) ('A' + i));
ch = iQ.get();
System.out.print(ch);
}
}
}
package qpack;
public interface ICharQ {
//поместить символ в очередь
void put(char ch) throws QueueFullException;
//извелечь символ из очереди
char get() throws QueueEmptyException;
}
package qpack;
//Динамическая очередь
public class DynQueue implements qpack.ICharQ {
private char q[];
private int putloc, getloc;
//создать пустую очередь заданного размера
public DynQueue(int size) {
q = new char[size + 1];
putloc = getloc = 0;
}
//Поместить символ в очередь
public void put(char ch) {
if (putloc == q.length - 1) {
//увеличить размер очереди
char t[] = new char[q.length * 2];
//скопировать элементы в новую очередь
for (int i = 0; i < q.length; i++)
t[i] = q[i];
q = t;
}
putloc++;
q[putloc] = ch;
}
//извлечь массив из очереди
public char get() {
if (getloc == putloc) {
System.out.println(" - Очередь пуста");
return (char) 0;
}
getloc++;
return q[getloc];
}
}
package qpack;
public class CircularQueue implements qpack.ICharQ {
private char q[];
private int putloc, getloc;
public CircularQueue(int size) {
q = new char[size + 1];
putloc = getloc = 0;
}
//поместить символ в очередь
public void put(char ch) {
/** Оередь считается полной, если индекс putloc на единицу меньше индекса
* getloc или если индекс putloc указывает на конец массива, getloc на его начало
*/
if (putloc + 1 == getloc | ((putloc == q.length - 1) & (getloc == 0))) {
System.out.println(" - Очередь заполнена");
return;
}
putloc++;
if (putloc == q.length) putloc = 0;
q[putloc] = ch;
}
//извлечь символ из очереди
public char get() {
if (getloc == putloc) {
System.out.println(" - Очередь пуста");
return (char) 0;
}
getloc++;
if (getloc == q.length) getloc = 0;
return q[getloc];
}
}
package qpack;
//Класс реализующий очередь для хранения символов фиксированного размера
class FixedQueue implements qpack.ICharQ {
private char q[]; //массив для хранения элементов очереди
private int putloc, getloc; //индексы вставляемых и извлекаемых элементов
//создать пустую очередь заданного массива
public FixedQueue(int size) {
q = new char[size + 1];
putloc = getloc = 0;
}
//поместить символ в очередь
public void put(char ch) {
if (putloc == q.length - 1) {
System.out.println(" - Очрередь заполнена");
return;
}
putloc++;
if (putloc == q.length) putloc = 0;//перейти в начало массива
q[putloc] = ch;
}
//извлечь символ из очереди
public char get() {
if (getloc == putloc) {
System.out.println(" - Очередь пуста");
return (char) 0;
}
getloc++;
if (getloc == q.length) getloc = 0;//вернуться в начало очереди
return q[getloc];
}
}
Ответы (1 шт):
Это происходит потому, что ты свои классы исключений создаешь без модификатора доступа public. В этом случае им по умолчанию присваивается модификатор default (он же package-private). То есть с этим модификатором доступа твои исключения могут использовать только классы, находящиеся в этом же пакете. Тебе надо объявить твои классы исключений как public, для этого тебе нужно каждое исключение создать в новом файле класса, а еще лучше создать пакет exceptions и поместить их туда.


