Java ClassNotFoundException

Я искал этот вопрос и не нашел решения.

Я использую решение, созданное мной для популярной задачи KataPokerHands. У меня два класса CardDeck и Dealer, дилер использует колоду карт. Когда я запускаю программу, я получаю сообщение об ошибке, в котором говорится, что JVM не может найти класс CardDeck, который вызывается классом Dealer, даже если оба класса существуют в одном каталоге.

это класс cardeck:

import java.util.ArrayList;
import java.util.Arrays;

public class CardDeck 
{
    private final ArrayList<String> deck;

    CardDeck() 
    {
        deck = new ArrayList<>();      
        for(int i = 2; i < 10; i++)
        {
            deck.add(i + "H");
            deck.add(i + "D");
            deck.add(i + "S");
            deck.add(i + "C");
        }

        deck.addAll(Arrays.asList("TH TD TS TC JH JD JS JC QH QD QS QC KH KD KS KC AH AD AS AC".split(" ")));
    }
    ArrayList<String> getDeck()
    {
        return deck;
    }
}

а это класс дилера:

    import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Dealer 
{
    int deckSize;
    ArrayList<String> newDeck;
    Random rand;

    Dealer() 
    {
        deckSize = 52;
        newDeck = new CardDeck().getDeck();
        Collections.shuffle(newDeck);
        rand = new Random(42);
    }

    ArrayList dealHand() 
    {
        ArrayList<String> myHand = new ArrayList<>();
        int cardIndex;
        for(int i = 0; i < 5; i++, deckSize--) 
        {
            cardIndex = rand.nextInt(deckSize);
            myHand.add(newDeck.get(cardIndex));
            newDeck.remove(cardIndex);// remove the card picked from the deck
        }
        return myHand;
    }
}

Вот класс, запускающий программу Pokergame.java:

import java.util.*;

public class PokerGame 
{

    public static void main(String[] args) 
    {

        Dealer dealer = new Dealer();

        ArrayList<String> PlayerOneHand = dealer.dealHand();
        ArrayList<String> PlayerTwoHand = dealer.dealHand();

        System.out.println("Player One's cards: " + PlayerOneHand);
        System.out.println("Player Two's cards: " + PlayerTwoHand);
        System.out.println();

        CompareHands hands = new CompareHands(PlayerOneHand, PlayerTwoHand);
        hands.compareHands(PlayerOneHand, PlayerTwoHand);
    }
}

И вот сообщение об ошибке:

Exception in thread "main" java.lang.NoClassDefFoundError: CardDeck at Dealer.(Dealer.java:14) at PokerGame.main(PokerGame.java:9) Caused by: java.lang.ClassNotFoundException: CardDeck at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 2 more

Вы добавляли импорт?

Sedrick 11.12.2018 21:13

Java потребуется путь к классам для поиска классов. Вы пробовали передать аргумент -cp команде java?

Alirus 11.12.2018 21:14

Вы можете разместить свой код? Как запустить классы, в которых IDE?

Christine 11.12.2018 21:15

Нет, я не включал импорт, я не добавлял эти классы в пакет, я думал, что программа будет работать, поскольку все классы находятся в одном каталоге.

Dalan Miller 11.12.2018 21:16

Я запускаю классы через командную строку, я написал код возвышенным текстом

Dalan Miller 11.12.2018 21:16

Было бы полезно, если бы вы добавили код и журнал ошибок в свой вопрос. Я не могу понять проблему, не видя ее.

J.A.P 11.12.2018 21:17

Я добавил код

Dalan Miller 11.12.2018 21:19

Добавлю журнал ошибок

Dalan Miller 11.12.2018 21:20

Можете ли вы также добавить PokerGame.java?

J.A.P 11.12.2018 21:27

Хорошо, я добавил PokerGame.java

Dalan Miller 11.12.2018 21:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
10
2 830
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Скорее всего, вы не скомпилировали класс CardDeck, поэтому его нет в пути к классам среды выполнения java. Предполагая, что вы делаете это вручную с помощью команды javac, вы можете перекомпилировать все исходные файлы в текущем каталоге с помощью:

javac *.java

А затем запустите PokerGame.main() с:

java PokerGame

Это сработало! Спасибо.

Dalan Miller 11.12.2018 21:38

@DalanMiller попробуй изучить инструмент сборки, такой как Maven или Gradle, он делает жизнь намного проще.

Karol Dowbecki 11.12.2018 21:39

Ошибка сообщает нам, что среда выполнения java не может найти файл CardDeck.class во время выполнения. Убедитесь, что он существует (скомпилируйте все три файла java) и что все три файла class находятся в одном каталоге.

И следите за тем, чтобы имена файлов в точности совпадали с именами классов, а именно: вам нужны файлы CardDeck.java, Dealer.java и PokerGame.java.

Другие вопросы по теме