Whenever I try to compile this Java program in the command prompt I get an error about System.out.printIn
saying that javac cannot find symbol. System.out.print works just fine but System.out.printIn refuses to cooperate. I’ve posted the program and the compiler message below. Thanks for the help.
public class BeerSong {
public static void main (String[] args) {
int beerNum = 99;
String word = "bottles";
while (beerNum > 0) {
if (beerNum == 1) {
word = "bottle"; //singular, ONE bottle
}
System.out.printIn(beerNum + " " + word + "of beer on the wall");
System.out.printIn(beerNum + " " + word + "of beer.");
System.out.printIn("Take one down.");
System.out.printIn("Pass it around.");
beerNum = beerNum - 1;
if (beerNum > 0) {
System.out.printIn(beerNum + " " + word + " of beer on the wall");
} else {
System.out.printIn("No more bottles of beer on the wall");
} //end else
} //end while loop
} //end main method
} //end class
C:UsersJesseDesktop>javac BeerSong.java
BeerSong.java:12: cannot find symbol
symbol : method printIn(java.lang.String)
location: class java.io.PrintStream
System.out.printIn(beerNum + " " + word + "of beer on the wall");
^
BeerSong.java:13: cannot find symbol
symbol : method printIn(java.lang.String)
location: class java.io.PrintStream
System.out.printIn(beerNum + " " + word + "of beer.");
^
BeerSong.java:14: cannot find symbol
symbol : method printIn(java.lang.String)
location: class java.io.PrintStream
System.out.printIn("Take one down.");
^
BeerSong.java:15: cannot find symbol
symbol : method printIn(java.lang.String)
location: class java.io.PrintStream
System.out.printIn("Pass it around.");
^
BeerSong.java:19: cannot find symbol
symbol : method printIn(java.lang.String)
location: class java.io.PrintStream
System.out.printIn(beerNum + " " + word + " of beer on the wall");
^
BeerSong.java:21: cannot find symbol
symbol : method printIn(java.lang.String)
location: class java.io.PrintStream
System.out.printIn("No more bottles of beer on the wall");
^
6 errors
Содержание
- Java: Ошибки при работе с переменными
- Задание
- The “Cannot find symbol” compilation error in Java
- What are possible solutions to this problem?
- Errors in Compilation Time
- Syntax errors
- Type-checking errors
- Compiler will crash
- Symbol Tables: An Overview
- Error: Cannot Find Symbol
- What causes the symbol cannot be found error?
- Symbol Not Found vs. Cannot Find Symbol vs. Cannot Resolve Symbol
- Examples of “Cannot Find Symbol Error.”
- Handling an undeclared variable
- Dealing with an Out of scope variable
- Method name misspelled
- An import statement is missing
- Examples that aren’t as common
- Other reasons for the problem “can’t find symbol” include:
- Inability to find symbol ‘var’:
- You’re not compiling or recompiling anything
- Incorrect dependencies
- An issue with a previous build
Java: Ошибки при работе с переменными
Порядок инструкций в коде с переменными имеет огромное значение. Переменная должна быть определена до того, как будет использована. Ниже пример ошибки, которую очень часто допускают новички:
Запуск программы выше завершается с ошибкой:
Ошибка cannot find symbol означает, что в коде используется переменная, которая не определена. Причем в самой ошибке об этом говорят прямо: variable greeting .
Кроме неправильного порядка определения, еще встречаются банальные опечатки, причем как при использовании переменной, так и при ее объявлении.
Еще одна распространенная ошибка — попытаться объявить уже объявленную переменную:
Так делать нельзя. Придется создать новую переменную.
Количество подобных ошибок уменьшается за счет использования правильно настроенного редактора. Такой редактор подсвечивает имена, которые используются без объявления, и предупреждает о возможных проблемах.
Задание
Найдите в программе необъявленную переменную и объявите ее, присвоив ей значение «Dragon» ;
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Источник
The “Cannot find symbol” compilation error in Java
Table of Contents
When a user refers to a variable that hasn’t been declared in the application, the “can’t find symbol” error occurs. To put it another way, the compiler isn’t aware of the variable’s declaration. For example:
What are possible solutions to this problem?
If you ever encounter this issue, you should review the code for the following scenarios:
- Make sure you’ve declared the variable, for example, int i = 15;. If int has not been written, the error may show.
- Also, see if the defined variable is outside the code, for example, if it is not a member of the HelloCodeunderscored class.
- Make sure you’re using the right case. If you declare a variable as var but access it as Var, it is an example of such a scenario.
- Numbers, dollar signs, and hyphens are not allowed in identifier values; check for them.
Errors in Compilation Time
The compiler examines and checks the code for various things during compilation, including reference types, type casts, and method declarations, to mention a few. This stage of the compilation process is crucial since it is here that we will encounter a compilation mistake.
Compile-time mistakes can be divided into three categories:
Syntax errors
One of the most common programming errors is failing to use a semicolon at the end of a statement; other typical errors include forgetting imports, mismatching parentheses, and omitting the return statement.
Type-checking errors
This is a method of ensuring that our code is type-safe. With this check, we provide that the kinds of expressions are consistent. If we define a variable of type int, we should never assign a value of type double or String to it.
Compiler will crash
Meanwhile, there’s a chance the compiler will crash. It is exceptionally uncommon, but it does happen. In this scenario, it’s good to know that the issue isn’t with our code but with something else.
Compilers follow a set of rules that are specific to each language. If a code doesn’t follow these requirements, the compiler won’t be able to convert it, resulting in a compilation error. The key to resolving the “Cannot find symbol” compilation problem is to figure out what’s causing it.
We may deduce the line of code where the problem occurred and which element is incorrect from the error message. Knowing the most common causes of this mistake will make it easier and faster to resolve.
Symbol Tables: An Overview
Compilers construct and maintain symbol tables, which are significant data structures for storing information related to identifiers in source code. This information is placed into symbol tables during lexical and syntactic analysis and subsequently used in the compilation process.
The identifiers of classes, interfaces, variables, and methods are bound to correspond entries in the symbol tables when the declarations are processed. When these identifiers appear in source code, the compiler looks them up in the symbol tables. It uses that information to confirm that a variable has been declared, establish the variable’s scope, and do type checking to ensure that an expression is semantically correct.
Symbol tables are also employed in the creation and optimization of code. The following is a simplified representation of a symbol table entry (or simply a symbol) in Java:
The comparable notation for a global variable declaration, such as final double ratio, would be .
Error: Cannot Find Symbol
As the name implies, the cannot locate symbol error refers to a symbol that you cannot find. While there are a variety of causes for this, they all boil down to the Java compiler being unable to locate the symbol associated with a given identifier.
Two more fields are included in the compiler’s message for the cannot locate symbol error:
“symbol” refers to the name and type of the referenced identifier. On the other hand, “location” refers to the class where the identifier is used.
What causes the symbol cannot be found error?
The following are the most typical causes of the cannot locate symbol compile-time error:
- Variable and method declarations missing,
- References to variables and methods being out of scope
- misspelled identifiers, and
- omitted import statements.
Symbol Not Found vs. Cannot Find Symbol vs. Cannot Resolve Symbol
The cannot find symbol issue can also be encountered under the words symbol not found and cannot resolve symbol, as different Java compilers use somewhat different wording. Apart from the names, there is no difference between the meanings of these phrases.
Examples of “Cannot Find Symbol Error.”
Some of these “Cannot find symbol error” are as follows:
Handling an undeclared variable
The cannot find symbol error is raised when the Java compiler encounters an identifier it can’t find in the symbol table. As a result, the most common cause of this error is when a reference to an undeclared variable is made. Unlike some other languages, which don’t require explicit variable declarations or may enable declaring a variable after it’s been referenced (through hoisting ), Java requires that a variable be declared before being used or referenced in any form.
Figure (a) shows how an undeclared variable, in this case, the identifier average on line 9, causes two instances of the cannot find symbol error at the code’s locations. Figure (b) resolves the issue by declaring this variable with its data type (or inferring its kind with the var keyword in Java 10+).
Dealing with an Out of scope variable
The compiler throws the cannot find symbol error when a Java application tries to access a variable declared in a separate (non-inherited or non-overlapping) scope. The effort to try and have access to the variable counter on lines 17 and 18 in Figure (a), which is only available within the statement declared on line 11, demonstrates this. Figure (b) indicates that moving the counter variable outside the for loop resolves the problem.
Figures (a) & (b): Error and resolution for not being able to discover a symbol for an out-of-scope variable.
Method name misspelled
A cannot locate symbol error is caused by misspelling an existing method or any valid identifier. Because Java identifiers are case-sensitive, any change of an existing variable, method, class, interface, or package name, as shown in Figure (b), will result in this error.
Error Figure (a) and resolution Figure (b): Cannot find the symbol for a misspelled method name
An import statement is missing
Using classes, whether from the Java platform or a library, necessitates appropriately importing them using the import statement. If you don’t, the Java compiler will complain about a symbol that can’t be found. The java.util package is used in the code sample in Figure (a). The cannot locate symbol issue arises because the list class was created without specifying the necessary import. The problem is solved by adding the missing import statement line 4 in Figure (b).
Figure (a) Error and resolution (b): Cannot find the symbol for missing import
Examples that aren’t as common
The fundamental cause of the Java error cannot locate the symbol is sometimes found in unexpected or hidden areas. It is the case when a sentence is prematurely terminated by an unintentional semicolon Figure (a) or when object creation is attempted without a correct constructor invocation, which must include the new keyword Figure 6.
Unable to locate a symbol for a prematurely stopped loop Figure (a) error and Figure (b) resolution
Figure (a) Error and Figure (b) Resolution for Cannot Find Symbol Constructor Call
Other reasons for the problem “can’t find symbol” include:
Here are a few instances where the “Cannot detect symbol” appears unexplainable until you investigate further.
Inability to find symbol ‘var’:
You’re presumably trying to compile source code with an older compiler or an older—source level that employs local variable type inference (i.e., a var declaration). In Java 10, the var was introduced. Check your JDK version, build files, and IDE settings (if this happens in an IDE).
You’re not compiling or recompiling anything
New Java programmers occasionally don’t grasp how the Java toolchain works or haven’t set up a repeatable “build process,” such as utilizing an IDE, Ant, Maven, Gradle, etc. In this case, the programmer may end up chasing his tail, looking for an imaginary fault that is caused by improper recompilation of the code, and so on.
Another example is when you compile and run a class with (Java 9+) java SomeClass.java. You’re likely to get “Cannot resolve symbol” errors referring to the 2nd class if the class depends on another class that you haven’t compiled (or recompiled). The other source file(s) are not compiled automatically. In addition, the new “compile and execute” mode of the java command isn’t suited for launching programs with multiple source code files.
Incorrect dependencies
If you use an IDE or a build tool that manages the build path and project dependencies, you may have made a mistake with the dependencies; for example, you may have left out a dependency or chosen the incorrect version. Check the project’s build file if you’re using a build tool (Ant, Maven, Gradle, etc.). Further, examine the project’s build path setup if you’re using an IDE.
An issue with a previous build
It’s possible that a previous build failed, so a JAR file was created with missing classes. You would usually note such failure if you were using a build tool. If you acquire JAR files from someone else, you’ll have to rely on them constructing correctly and catching mistakes.
Use tar -tvf when you need to list the suspected JAR files contents if you suspect this.
Источник
Symbols and Symbol Table
Before diving into the details of the “cannot find a symbol” error, here is a brief introduction to symbols and symbol tables in Java. A symbol refers to an identifier in the compilation process in Java. All the identifiers used in the source code are collected into a symbol table in the lexical analysis stage. The symbol table is a very significant data structure created and maintained by the compilers to store all the identifiers and their information.
This information is entered into the symbol tables during lexical and syntax analysis which is then used in multiple phases of compilation.
From classes, variables, interfaces to methods, all of them require an identifier for declaration. During the code generation process, when these identifiers are encountered in the source code, the compiler checks for them in the symbol tables and the stored information is then used to verify the declarations, the scope of a variable, and verifying that the expression is semantically correct or not.
The compilation process usually does not go as smooth as you would think. Errors are inevitable in any development stage and one of the very commonly occurring errors during the compilation process is Java “cannot Find Symbol” Error. In this article, we will be discussing the reasons behind the occurrence of Java cannot find symbol errors and how you can resolve them.
As the name suggests, the Java cannot find symbol error occurs when a required symbol cannot be found in the symbol table. Although there can be various reasons behind this, it points to one fact the Java compiler was unable to find the symbol and its details associated with a given identifier.
As there are a variety of Java compilers available, many of them use slightly different terminologies, because of that, you can also find the “cannot find symbol” error termed as the “symbol not found” or “cannot resolve symbol” error. Besides the name, there is simply no difference between these errors.
Structure of Java Cannot Find Symbol Error
The compiler output a specific error message with the cannot find symbol error.
It contains the following two fields that indicate the missing symbol and its location:
- Symbol: The name and type of the identifier you are looking for.
- Location: The particular class in which that identifier has been referenced.
Causes of Java Cannot Find Symbol Error
We will be discussing the following most common causes of the cannot find symbol error during compilation,
- misspelt identifiers
- Undeclared variables
- Out of scope references to variables and methods
- The unintentional omission of import statements
Misspelt identifier names
This is the most common and most occurring reason behind the Java cannot find symbol error. Misspelling an existing variable, class, interface, package name or a method causes the “cannot find symbol error” as the compiler cannot recognize the symbol and identifies it as an undeclared variable. Java identifiers are also case-sensitive, so even a slight variation of an existing variable will result in this error.
See code example below:
1. public class MisspelledMethodNameExample { 2. static int findLarger(int n1, int n2) { 3. if (n1 > n2) return n1; 4. if (n2 > n11) return n2; 5. if (n2 == n11) return -1; 6. } 7. 8. public static void main(String... args) { 9. int value = findlarger(20, 4); // findlarger ≠ findLarger 10. System.out.println(value); 11. } 12. }
MisspelledMethodNameExample.java:9: error: cannot find symbol int value = Fibonacci(20); ^ symbol: method findLarger(int, int) location: class MisspelledMethodNameExample
It can be easily resolved by correcting the spelling of the function in line 9.
Undeclared variables
When the Java compiler come across an identifier used in the code but it cannot be found in the symbol table, the “cannot find symbol” error is shown. The only reason behind the absence of a variable from the symbol table is that it is not declared in the code. Some new programming languages do not require explicit declaration of variables but it is mandatory in Java to always declare a variable before it is used or referenced in the source code.
The code snippet below demonstrates an undeclared variable in the code. In this case, the identifier sum on line 7, causes the Java “cannot find symbol error”.
See code example below:
1. public class UndeclaredVariableExample 2. { 3. public static void main(String... args) { 4. int num1 = 5; 5. int num2 = 10; 6. int num3 = 43; 7. sum = (num1 + num2 + num3) // sum is not declared 8. System.out.println(sum); 9. } 10. }
UndeclaredVariableExample.java:7: error: cannot find symbol sum = (num1 + num2 + num3); ^ symbol: variable sum location: class UndeclaredVariableExample UndeclaredVariableExample.java:8: error: cannot find symbol System.out.println(sum); ^ symbol: variable sum location: class UndeclaredVariableExample 2 errors
Declaring this variable by specifying the appropriate data type can easily resolve the error.
See this corrected code below,
1. public class UndeclaredVariableExample 2. { 3. public static void main(String args) { 4. int num1 = 5; 5. int num2 = 10; 6. int num3 = 43; 7. 8. int sum = (num1 + num2 + num3); 9. System.out.println(sum); 10. } 11. }
Out of scope variable
When a Java code attempts to access a variable declared out of scope such as in a non-inherited scope the compiler will result in issuing the “cannot find symbol” error. This commonly happens when you attempt to access a variable declared inside a method or a loop, from outside of the method.
See this code example below where the “cannot find symbol” error has occurred when the counter variable which is declared inside a for loop is attempted to be accessed from out of the loop.
See code below:
1. public class OutOfScopeExample 2. { 3. public static void main(String args) { 4. 5. for (int counter = 0; counter < 100; counter++) 6. { … } 7. 8. System.out.println(“Even numbers from 0 to 100”) 9. if (counter mod 2 == 0) 10. { 11. System.out.println(counter); 12. } 13. } 14. }
OutOfScopeVariableExample.java:9: error: cannot find symbol if (counter mod 2 == 0) ^ symbol: variable counter location: class OutOfScopeVariableExample OutOfScopeVariableExample.java:12: error: cannot find symbol System.out.println(counter); ^ symbol: variable counter location: class OutOfScopeVariableExample 2 errors
I can be easily resolved by just moving the if block inside the for loop (local scope).
See this code example,
1. public class OutOfScopeExample 2. { 3. public static void main(String... args) { 4. 5. for (int counter = 0; counter < 100; counter++) 6. { 7. System.out.println(“Even numbers from 0 to 100”) 8. if (counter mod 2 == 0) 9. { 10. System.out.println(counter); 11. } 12. } 13. } 14. }
Missing import statement
Java allows you to use built-in classes or any imported libraries in your code to save your time by reusing the code but it requires importing them properly using the import statements at the start. Missing the import statement in your code will result in the cannot find symbol error.
java.util.Math class is utilized in the code given below but it is not declared with the “import” keyword, resulting in the “cannot find symbol error”.
See code below:
1. public class MissingImportExample { 2. 3. public static void main(String args) 4. { 5. double sqrt19 = Math.sqrt(19); 6. System.out.println("sqrt19 = " + sqrt19); 7. } 8. }
MissingImportExample.java:6: error: cannot find symbol double sqrt19 = Math.sqrt(19); ^ symbol: class Math location: class MissingImportExample
Adding the missing import statement can easily solve the issue, see code below:
1. import java.util.Math; 2. 3. public class MissingImporExample { 4. 5. public static void main(String args) 6. { 7. double sqrt19 = Math.sqrt(19); 8. System.out.println("sqrt19 = " + sqrt19); 9. } 10. }
Miscellaneous reasons
We have covered some of the main causes of the “cannot find symbol” Java error but occasionally it can also result due to some unexpected reasons. One such case is when attempting to create an object without the new keyword or an accidental semicolon at the wrong place that would terminate the statement at an unexpected point.
Also Read: Functional Interfaces In Java
Some other causes for the cannot find symbol error may include when you forget to recompile the code or you end up using the dependencies with an incompatible version of Java. Building a project with a very old JDK version can also be a reason as well as mistakenly redefining platform or library classes with the same identifier.
Conclusion
We have discussed that the “cannot find symbol Java” error is a Java compile-time error which is encountered whenever an identifier in the source code is not identified by the compiler. Similar to any other compilation error, it is very significant to understand the causes of this error, so that you can easily pinpoint the issue and address it properly.
Once you can discover the reason behind the error, it can be easily resolved as demonstrated by various examples in this article.
Ну конечно! Откуда методу print знать о переменных метода add?))Почитайте о полях класса и сделайте name , type и т.д. статическими полями…
Добавлено через 16 минут
Вот вам подробный ответ:
Итак:
1) У вас есть два класса catalog и drink
2) В классе каталога есть несколько статических методов;
3) класс каталог подразумевает управление созданными напитками
4)класс drink инкапсулирует алкогольный напиток
О чем вы не знаете:
1) статические методы не имеют информацию а нестатических переменнвх и методах, имейте это ввиду;
2)нестатические переменные не существуют, пока вы не создадите обьект : что это значит?
Представьте себе темный сосуд с напитком(без надписей), пока вы не инициализаруете, тобишь не нальете напиток, вы не знаете , Что это за напиток…
3)Переменные метода — методы могут иметь внутри себя вспомогательные переменные…
В чем основная ошибка:
в методе add() вы создаете те самые вспомогательные переменные , о которых не известно ничего за пределами add().(та же ошибка в print).
Что стоит почитать:
1)О полях класса;
2) О сокрытии переменной;
3) О модификаторах доступа
4) О разнице статических и нестатических членов класса
The “cannot find symbol” error occurs mainly when we try to reference a variable that is not declared in the program which we are compiling, it means that the compiler doesn’t know the variable we are referring to.
Some possible causes for “Cannot find symbol” to occur are
- Using a variable that is not declared or outside the code.
- Using wrong cases (“tutorials” and “Tutorials» are different) or making spelling mistakes.
- The packaged class has not been referenced correctly using an import declaration.
- Using improper identifier values like letters, numbers, underscore and dollar sign. The hello-class is different from helloclass.
Example
public class CannotFindSymbolTest { public static void main(String[] args) { int n1 = 10; int n2 = 20; sum = n1 + n2; System.out.println(sum); } }
Output
CannotFindSymbolTest.java:5: error: cannot find symbol sum = n1 + n2; ^ symbol: variable sum location: class CannotFindSymbolTest CannotFindSymbolTest.java:7: error: cannot find symbol System.out.println(sum); ^ symbol: variable sum location: class CannotFindSymbolTest
In the above program, «Cannot find symbol» error will occur because “sum” is not declared. In order to solve the error, we need to define “int sum = n1+n2” before using the variable sum.
Ошибки «Не удается найти символ» обычно возникают, когда вы пытаетесь ссылаться на необъявленную переменную в коде. Ошибка «Не удается найти символ» означает, что компилятор не может этого сделать. Ваш код, похоже, ссылается на то, что компилятор не понимает.
Когда ваш код компилируется, компилятору необходимо выяснить, что означает каждый идентификатор вашего кода. Когда компилятор просматривает код, он найдет что-то и знает, что с ним делать или нет. Ошибка «Не удается найти символ» относится к идентификаторам и означает, что Java не может понять, что означает «символ».
Пример
public class TestClass { public static void main(String[] args) { int x = 2; int y = 4; sum = x + y ; System.out.println(sum); } }
Выход
TestClass.Java:10: error: cannot find symbol sum = x + y ; symbol: variable sum location: class TestClass TestClass.Java:11: error: cannot find symbol System.out.println(sum); symbol: variable sum location: class TestClass 2 errors
В приведенном выше коде переменная сумма не была объявлена, вам нужно сообщить компилятору, каков тип суммы; например:
int sum = x + y ;
Общими причинами ошибки «Не удается найти символ» являются такие вещи, как:
Общими причинами ошибки «Не удается найти символ» являются такие вещи, как:…
Источник: http://net-informations.com/Java/cJava/symbol.htm