Denisowator Ответов: 2

Java-компилятор видит ссылку как переменную?


Я работал над проектом колледжа в течение последнего месяца, и пока все идет хорошо.

Я кодировал его на Java, и прямо сейчас я пытаюсь протестировать свою программу, скомпилировав ее и запустив файл .class. Я компилирую его в cmd (Командная строка).

Когда я пытаюсь скомпилировать его, он показывает 4 ошибки "не могу найти символ", все они указывают переменную. Я обнаружил, что все эти "переменные" на самом деле являются именами классов, которые я использую для вызова других классов в других файлах.

Ошибка повторяется для следующих имен классов: "TempFiles", "ExplorerHistory", "Downloads"и " RecycleBin".

Вот код, который вызывает классы:
if(chckbxTemporaryFilesUser.isSelected()) {
    TempFiles.deleteTemporaryFiles();
}
		
if(chckbxFileExplorerUser.isSelected()) {
    ExplorerHistory.deleteExplorerHistory();
}
		
if(chckbxDownloadsUser.isSelected()) {
    Downloads.deleteDownloads();
}
	
if(chckbxRecycleBinUser.isSelected()) {
    RecycleBin.deleteRecycleBin();
}


Как вы можете видеть, код проверяет, установлен ли определенный флажок, а затем вызывает класс и метод. Например, если установлен флажок "загрузки", он вызывает класс" загрузки "и метод" deleteDownloads " внутри этого класса.

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


Вот начало моего основного класса, показывающего все методы в нем и весь импорт (я удалил большую часть иррелевантного кода и оставил только методы):
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import javax.swing.*;
import java.awt.*;

public class Pither implements ActionListener {
	
	private JFrame frame;
	public static void main(String[] args) {

	}

	public Pither() {
		initialize();
	}

	private void initialize() {

}
	@Override
	public void actionPerformed(ActionEvent e) {
        /*
        This is where the classes are being called from.
        aka where the "if" statements are.
        */
}


А вот и начало класса TempFiles:
import java.io.File;
import java.io.IOException;

public class TempFiles {
	private static final

public static void main(String[] args) {
	deleteTemporaryFiles();
}
	public static void deleteTemporaryFiles() {

    }

    public static void delete(File file)



Вот точные ошибки, которые отображаются в cmd:

Pither.java:422: error: cannot find symbol
                        TempFiles.deleteTemporaryFiles();
                        ^
  symbol:   variable TempFiles
  location: class Pither
Pither.java:426: error: cannot find symbol
                        ExplorerHistory.deleteExplorerHistory();
                        ^
  symbol:   variable ExplorerHistory
  location: class Pither
Pither.java:430: error: cannot find symbol
                        Downloads.deleteDownloads();
                        ^
  symbol:   variable Downloads
  location: class Pither
Pither.java:434: error: cannot find symbol
                        RecycleBin.deleteRecycleBin();
                        ^
  symbol:   variable RecycleBin
  location: class Pither


Операторы " if " находятся в конце основного класса, поэтому 422-434 подтверждает, что именно они вызывают ошибки.


P.S. Пожалуйста, попробуйте говорить на "базовом уровне", так как я все еще довольно новичок в Java и начал изучать его менее 2 месяцев назад.

Что я уже пробовал:

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

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

Jochen Arndt

Ошибки говорят вам, что компилятор не знает этих классов.

Так где же они объявлены?

Denisowator

Они объявляются в отдельных файлах, расположенных в той же папке, что и основной исходный код. (надеюсь, это имеет смысл, я довольно плохо объясняю вещи)

Как я уже сказал, раньше он работал нормально, но теперь вдруг выдает мне эти ошибки при компиляции. Должен ли я включать внешние файлы в путь к классу при компиляции?

Я также не упомянул, что использую внешние банки, и их команды давали аналогичные ошибки. И после включения их в путь к классам во время компиляции ошибки были исправлены. Так что, может быть, это сработает, если я включу файлы классов, которые вызывают операторы if?

Jochen Arndt

Тогда вы, вероятно, забудете их импортировать. Видишь https://docs.oracle.com/javase/tutorial/java/package/usepkgs.html.

Denisowator

Я прочитал связанную веб-страницу, но все еще в замешательстве. Что бы я точно поместил в строку импорта, чтобы направить код в эти файлы?

Просто если это будет полезно, вот текущий адрес каталога для файлов класса: "C:\Users\Denisowator\workspace\Pither\bin".

Jochen Arndt

Смотрите мое решение.

В целом вы должны прочитать некоторые учебные пособия по управлению проектами Java (связанные с используемой IDE).

2 Ответов

Рейтинг:
2

Richard MacCutchan

Ваш код использует имена классов так, как если бы они были переменными, поэтому сообщения об ошибках верны. Предположим, что где-то в вашем коде вы объявили переменную типа TempFiles любить:

TempFiles tempObj = new TempFiles();

// then your usage should be:

tempObj.deleteTemporaryFiles();


Denisowator

Я проверил весь свой код, и там нет переменных такого типа.

Richard MacCutchan

Тогда ваш код никогда не будет работать.

Richard MacCutchan

Я думаю, тебе нужно пойти в Урок: классы и объекты (учебные пособия Java™ > изучение языка Java)[^] и внимательно изучите его.

Denisowator

Но это работает. Если я запускаю его в IDE, такой как NetBeans или Eclipse, он работает нормально, и консоль не отображает никаких ошибок. Именно когда я пытаюсь скомпилировать код в терминале, подобном cmd, он отображает ошибки.

Тем не менее, спасибо за ссылку. Я прочел ее и расширил свои знания. :)

Richard MacCutchan

Ну, должно быть, есть что-то, о чем Вы нам не говорите.

Denisowator

Если и есть, то это что-то, о чем я не знаю.

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

Richard MacCutchan

Вы #import утверждения в вашей основной программе для классов, которые не найдены?
Объявлены ли методы, которые вы пытаетесь вызвать static?

Пожалуйста, обновите свои вопросы, удалив весь тот код, связанный с флажками, который не имеет отношения к этой проблеме. Покажите первые 10 или 20 строк вашей основной программы, и то же самое для одного из других классов.

Denisowator

Я обновил вопрос.

Richard MacCutchan

Тогда мой комментарий выше отчасти верен:
1. Вы не импортировали Tempfiles класс в ваш Pither источник.
2. У вас есть main метод в вашем Tempfiles класс, которого не должно быть. Вам нужен только основной метод в классе "main" вашего приложения.
3. Также вы объявили все свои методы в Tempfiles класс как static- а это не очень хорошая идея.

Я снова предлагаю вам перейти по ссылке, приведенной в моем комментарии 21 час назад, и изучить раздел учебника Java по классам и объектам.

[no name]

Скорее всего, потому, что ваша IDE включает в себя файлы для вас, где в командной строке вам нужно было бы сделать это самостоятельно.

Denisowator

Весьма вероятно, если подумать.

Mohibur Rashid

Что такое ваша инструкция командной строки?

Denisowator

и javac -СР c:/users/denisowator/workspace/pither/src Pither.java

После пути у меня есть 2 разных внешних банки. Вот полный текст заявления...

и javac -СР c:/users/denisowator/workspace/pither/src/lib/jfreecharts-1.0.1.jar;c:/users/denisowator/workspace/pither/src/lib/jcommon-1.0.0.jar; Pither.java

Mohibur Rashid

попробуйте сделать это, сначала скопируйте все файлы jar, которые использует это приложение, в один каталог. скажем, путь к каталогу c:/users/denisowator/workspace/pither/src/lib / попробуйте выполнить следующую команду
javac-classpath " c:/users/denisowator/workspace/pither/src/lib/*" Pither.java

Mohibur Rashid

кроме того, ваше утверждение не является неправильным

Richard MacCutchan

Содержит ли какой-либо из этих jar-файлов классы, которые вы пытаетесь включить?

Denisowator

Нет.

Richard MacCutchan

Тогда неудивительно, что ваши компиляторы терпят неудачу. Могу ли я предложить вам потратить некоторое время на изучение языка Java и на то, как скомпилировать исходный код java в классы java?

Denisowator

Спасибо за совет, я так и сделаю. :)

Рейтинг:
1

Jochen Arndt

Реальное описание проблемы скрыто в этом комментарии:

Цитата:
Но это работает. Если я запускаю его в IDE, такой как NetBeans или Eclipse, он работает нормально, и консоль не отображает никаких ошибок. Именно когда я пытаюсь скомпилировать код в терминале, подобном cmd, он отображает ошибки.

При использовании IDE у вас есть своего рода управление проектами, которое помогает организовывать файлы и даже классы. IDE также выполнит компилятор командной строки, но передаст дополнительные аргументы конкретного проекта.

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