интерфейс находящийся в пакете не видит созданное исключение

Делаю тестовые примеры по книге Шилдт. 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 шт):

Автор решения: NarasuOo

Это происходит потому, что ты свои классы исключений создаешь без модификатора доступа public. В этом случае им по умолчанию присваивается модификатор default (он же package-private). То есть с этим модификатором доступа твои исключения могут использовать только классы, находящиеся в этом же пакете. Тебе надо объявить твои классы исключений как public, для этого тебе нужно каждое исключение создать в новом файле класса, а еще лучше создать пакет exceptions и поместить их туда.

→ Ссылка