Ошибка "Не удается найти символ" - даже на нелепо простом примере

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

У меня два .java файлы. Один Test.java другой testClass.java,

//testClass.java

package test;

public class testClass {
    private int someMember=0;

    public testClass(){
        //kill me now
    }

}

Тогда у меня есть файл Test.java, который содержит мой основной метод. (хотя в моей реальной проблеме у меня нет основного метода - это сервлет с doGet() метод)

//Test.java
package test;

public class Test {

    public static void main(String[] args) {
        testClass myTest = new testClass();
    }
}

Я компилирую со следующим (из командной строки Windows, с текущим каталогом, где я сохранил мои файлы.java):

..java bin location..\javac testClass.java

Это работает абсолютно нормально, и я получаю файл testClass.class в текущем каталоге. Затем я пытаюсь скомпилировать файл Test.java со следующим (снова в рабочем каталоге):

..java bin location..\javac -classpath . Test.java

Это приводит к следующей ошибке:

Test.java:6: cannot find symbol
symbol : class testClass
location : class test.testClass
   testClass myTest = new testClass();

Можете ли вы помочь брату?:(

3 ответа

Решение

Ваши классы находятся в пакете, и Java будет искать классы, предполагая, что структура пакета - но javac не будет строить эту структуру для вас, пока вы не скажете это; он обычно помещает файл класса рядом с файлом Java.

Опции:

  • Поместите исходные файлы в test каталог и компилировать test\Test.java а также test\testClass.java
  • Уточнить -d . когда вы компилируете, чтобы заставить javac создать структуру пакета.

Использование IDE (Eclipse, IntelliJ и т. Д.) Имеет тенденцию поощрять или даже заставлять вас помещать файлы в правильный каталог и, как правило, также упрощает сборку кода.

Я сделал именно то, что ты сделал

$ ls -la test/
drwxr-xr-x  6 amirraminfar  staff  204 Jul 21 10:24 .
drwxr-xr-x  3 amirraminfar  staff  102 Jul 21 10:23 ..
-rw-r--r--  1 amirraminfar  staff  148 Jul 21 10:24 Test.java
-rw-r--r--  1 amirraminfar  staff  140 Jul 21 10:24 testClass.java

Потом скомпилировал

$ javac test/*

Затем запустил его. И все это сработало. Это говорит о том, что проблема в том, как вы компилируете. Вы пытались собрать оба класса вместе?

 $ java test.Test

Изменить - я положил все свои файлы в test/ реж, как сказал Джон Скит. Может быть, это то, что отличается.

Самое простое решение: создать каталог test и поместите свой .javaтам, добавьте папку, которая содержит ваш testпапка в путь к классам. Если вы не знаете, как это сделать, просто поместите test-папка в подпапке вашей java-папки lib (например, c:\prog\javasdk\lib). Просто скомпилируйте с javac Test.java (testClass скомпилируется автоматически), запустите его с java test.Test откуда угодно.

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