Cant find symbol. [X2]

Чтобы запустить Java файл из CMD, нужно ввести такие комманды.

javac PurchasesAmountApp.java
java PurchasesAmountApp

Но если написать javac PurchasesAmountApp.java, то происходит такая ошибка.

PurchasesAmountApp.java:10: error: cannot find symbol
        PurchasesAmountAppUI Application = new PurchasesAmountAppUI(WindowIcon, WindowTitle, WindowXY, WindowSize);
        ^
  symbol:   class PurchasesAmountAppUI
  location: class PurchasesAmountApp
PurchasesAmountApp.java:10: error: cannot find symbol
        PurchasesAmountAppUI Application = new PurchasesAmountAppUI(WindowIcon, WindowTitle, WindowXY, WindowSize);
                                               ^
  symbol:   class PurchasesAmountAppUI
  location: class PurchasesAmountApp
2 errors

PurchasesAmountApp.java

package PurchasesAmount;

public class PurchasesAmountApp {
    public static void main(String[] args) {
        final String WindowIcon = "PurchasesAmount\\Resources\\Icon.png";
        final String WindowTitle = "Вычислитель общей суммы покупок.";
        final int[] WindowXY = {250, 200};
        final int[] WindowSize = {500, 300};

        PurchasesAmountAppUI Application = new PurchasesAmountAppUI(WindowIcon, WindowTitle, WindowXY, WindowSize);
    }
}

PurchasesAmountAppMechanics.java

package PurchasesAmount;

public class PurchasesAmountAppMechanics {
    public int CountAmount(int[] Amounts) {
        int Total = 0;

        for(int Amount : Amounts) {
            Total += Amount;
        }

        return Total;
    }

    public int[] ConvertArrayElementsToInt(String[] Arr) {
        int[] ConvertedArray = new int[Arr.length];

        for(int i = 0; i < Arr.length; i++) {
            ConvertedArray[i] = Integer.parseInt(Arr[i]);
        }

        return ConvertedArray;
    }

    public int[] ParseAmounts(String Str) {
        String[] Amounts = Str.split(", ");
        int[] ConvertedAmounts = ConvertArrayElementsToInt(Amounts);

        return ConvertedAmounts;
    }

    public int Count(String Str) {
        try {
            int[] Amounts = ParseAmounts(Str);
            int Total = CountAmount(Amounts);

            return Total;
        }

        catch (Exception Err) {
            return -1;
        }
    }
}

PurchasesAmountAppUI.java

package PurchasesAmount;

import javax.swing.JFrame;

import java.awt.Container;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import java.awt.GridLayout;

import javax.swing.ImageIcon;

import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JTextField;

import javax.swing.JOptionPane;

public class PurchasesAmountAppUI extends JFrame {
    final private PurchasesAmountAppMechanics Mechanics = new PurchasesAmountAppMechanics();

    final private String PurchasesAmountLabelContent = "Сумма покупки !Amount.";

    final private JLabel PurchasesAmountLabel = new JLabel(PurchasesAmountLabelContent);
    final private JTextField AmountsTextField = new JTextField("10, 20, 20", 15);
    final private JButton CalculateTotalAmountButton = new JButton("Рассчитать сумму покупки.");
    final private JLabel AppVersionDataLabel = new JLabel("1.0, Beta.");

    public PurchasesAmountAppUI(String AppIcon, String AppTitle, int[] AppXY, int[] AppSize) {
        super(AppTitle);

        this.setBounds(AppXY[0], AppXY[1], AppSize[0], AppSize[1]);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ImageIcon WindowIcon = new ImageIcon(AppIcon);
        this.setIconImage(WindowIcon.getImage());

        Container Pane = this.getContentPane();

        GridLayout WindowLayout = new GridLayout(0, 1, 4, 6);

        Pane.setLayout(WindowLayout);

        AmountsTextField.setToolTipText("Введите сумму покупки, через запятую с пробелом. Пример: \"10, 10, 10, 10, 10\", разрешены только цифры, ничего другого.");

        CalculateTotalAmountButtonClicked CalculateTotalAmountButtonFunction = new CalculateTotalAmountButtonClicked();

        CalculateTotalAmountButton.addActionListener(CalculateTotalAmountButtonFunction);

        Pane.add(PurchasesAmountLabel);
        Pane.add(AmountsTextField);
        Pane.add(CalculateTotalAmountButton);
        Pane.add(AppVersionDataLabel);

        this.setVisible(true);
    }

    class CalculateTotalAmountButtonClicked implements ActionListener{
        public void actionPerformed(ActionEvent Event) {
            String Amounts = AmountsTextField.getText();

            int Calculated = Mechanics.Count(Amounts);

            if (Calculated == -1) {
                JOptionPane.showMessageDialog(null, "Вы ввели что-то не то. Наведите на текстовое поле мышку, и посмотрите краткую инструкцию.", "Вычислитель общей суммы покупок.", JOptionPane.INFORMATION_MESSAGE);

            } else {
                PurchasesAmountLabel.setText(PurchasesAmountLabelContent.replace("!Amount", Calculated + ""));
            }
        }
    }
}

Icon.png

Структура файла.

Full.

Что делать?


Ответы (1 шт):

Автор решения: Alex Rudenko

Во-первых, нужно указать директорию, в которой запускаются компилятор javac и среда выполнения java.

Также при компиляции стоит указывать директорию при помощи ключа -d, в которую будут сохраняться скомпилированные .class файлы.

Предположим, исходный код пакета PurchasesAmount лежит в директории tmp\src, тогда он успешно компилируется командой

F:\tmp\src>javac -d ..\classes PurchasesAmount\PurchasesAmountApp.java

Проверка результатов компиляции:

F:\tmp\src>dir /s ..\classes

 Directory of F:\tmp\classes

2021-11-12  19:09    <DIR>          .
2021-11-12  19:09    <DIR>          ..
2021-11-12  19:09    <DIR>          PurchasesAmount
               0 File(s)              0 bytes

 Directory of F:\tmp\classes\PurchasesAmount

2021-11-12  19:09    <DIR>          .
2021-11-12  19:09    <DIR>          ..
2021-11-12  19:09               625 PurchasesAmountApp.class
2021-11-12  19:09               980 PurchasesAmountAppMechanics.class
2021-11-12  19:09             2,339 PurchasesAmountAppUI$CalculateTotalAmountButtonClicked.class
2021-11-12  19:09             2,529 PurchasesAmountAppUI.class
               4 File(s)          6,473 bytes

Для запуска программы java ей нужно указать путь к классам (CLASSPATH), при помощи параметра -cp. Кроме того, следует помнить, что для запуска понадобится полное имя класса, включающее название пакета:

F:\tmp\src>cd ..

F:\tmp>java -cp .\classes PurchasesAmount.PurchasesAmountApp
→ Ссылка