Исключение в потоке "main" java .lang.IllegalAccessError: не удалось получить доступ к классу - PullRequest
0 голосов
/ 02 апреля 2020

Итак, я пытаюсь запустить конкретный файл с именем CountdownTree. java, который наследует функции из множества других файлов в пакете comp2402a4.

Это были все начальные файлы, предоставленные моим инструктором, которые я я должен добавить, и не должно быть никаких ошибок при запуске этих файлов. Я скомпилировал его, используя 'javac comp2402a4 / CountdownTree. java', и он без проблем скомпилировался. Но когда я пытаюсь запустить его, используя 'java comp2402a4 / CountdownTree. java', я получаю сообщение об ошибке:

Exception in thread "main" java.lang.IllegalAccessError: failed to access class 
comp2402a4.DefaultComparator from class comp2402a4.CountdownTree (comp2402a4.DefaultComparator is in 
unnamed module of loader 'app'; comp2402a4.CountdownTree is in unnamed module of loader 
com.sun.tools.javac.launcher.Main$MemoryClassLoader @21507a04)
        at comp2402a4.CountdownTree.<init>(CountdownTree.java:26)
        at comp2402a4.CountdownTree.main(CountdownTree.java:53)

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

CountdownTree. java:

package comp2402a4;

import java.util.Random;
import java.util.SortedSet;
import java.util.TreeSet;

/**
* An unfinished implementation of an Countdown tree (for exercises)
* @author morin
*
* @param <T>
*/
public class CountdownTree<T> extends
BinarySearchTree<CountdownTree.Node<T>, T> implements SSet<T> {

    // countdown delay factor
    double d;

    public static class Node<T> extends BSTNode<Node<T>,T> {
        int timer;  // the height of the node
    }

    public CountdownTree(double d) {
        this.d = d;
        sampleNode = new Node<T>();
        c = new DefaultComparator<T>();
    }

    public boolean add(T x) {
        Node<T> u = new Node<T>();
        u.timer = (int)Math.ceil(d);
        u.x = x;
        if (super.add(u)) {
            // add some code here
            return true;
        }
        return false;
    }

    public void splice(Node<T> u) {
        Node<T> w = u.parent;
        super.splice(u);
        // add some code here (we just removed u from the tree)
    }

    protected void explode(Node<T> u) {
        // Write this code to explode u
        // Make sure to update u.parent and/or r (the tree root) as appropriate
    }

    // Here is some test code you can use
    public static void main(String[] args) {
        Testum.sortedSetSanityTests(new SortedSSet<Integer>(new CountdownTree<Integer>(1)), 1000);
        Testum.sortedSetSanityTests(new SortedSSet<Integer>(new CountdownTree<Integer>(2.5)), 1000);
        Testum.sortedSetSanityTests(new SortedSSet<Integer>(new CountdownTree<Integer>(0.5)), 1000);

        java.util.List<SortedSet<Integer>> ell = new java.util.ArrayList<SortedSet<Integer>>();
        ell.add(new java.util.TreeSet<Integer>());
        ell.add(new SortedSSet<Integer>(new CountdownTree<Integer>(1)));
        ell.add(new SortedSSet<Integer>(new CountdownTree<Integer>(2.5)));
        ell.add(new SortedSSet<Integer>(new CountdownTree<Integer>(0.5)));
        Testum.sortedSetSpeedTests(ell, 1000000);
    }
}

Вот папка со всеми файлами в пакете, если вы хотите чтобы запустить его:

https://drive.google.com/drive/folders/1Cu0qNud7-1ACqLvyLahKiVVk0aHcLMEr?usp=sharing

1 Ответ

0 голосов
/ 30 апреля 2020

Actual Issue

Я получил точно такую ​​же ошибку *, что-то сделал очень глупо:

Я попытался запустить файл как java {main-class}.java. Это просто!

Вместо этого обязательно запустите его просто как java {main-class}.


* В частности, у меня был формат ошибки, такой как у вас:

Исключение в потоке "main" java .lang.IllegalAccessError: не удалось получить доступ к классу {pack.other-class} из класса {pack.main-class} ({pack.other-class} находится в неназванном модуле загрузчика 'app'; {pack.main-class} находится в безымянном модуле загрузчика com.sun.tools. javac .launcher.Main $ MemoryClassLoader @ 29f69090)

в {pack.main-class}. {who-cares-where}
в {pack.main-class}. {who-cares-why}
. , .


Дополнительные рекомендации

Вы можете получить аналогичную досадную ошибку по той же проблеме, а именно невозможность доступа к пакетам в одном и том же директории, если вы компилируете только {main-class}.

Так что вместо javac {directory}/{main-class}.java

Обязательно скомпилируйте их все одновременно, поэтому в перекрестных ссылках нет проблем:
javac {directory}/*.java


OP Specifi c

Я скачал с вашего Google Диска Папка, чтобы убедиться, что вы также получаете эту ошибку из-за не более чем глупой командной строки snafu. Тем не менее, я получил совершенно не связанную ошибку, поэтому я думаю, что вы с тех пор изменили файлы. Тем не менее, я надеюсь, что это по крайней мере служит кому-то еще, если не вы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...