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.
Table of Contents
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.
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:
We will be discussing the following most common causes of the cannot find symbol error during compilation,
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.
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”.
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. }
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. }
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”.
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. }
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.
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.
Shaharyar Lalani is a developer with a strong interest in business analysis, project management, and UX design. He writes and teaches extensively on themes current in the world of web and app development, especially in Java technology.
Create a free profile and find your next great opportunity.
Sign up and find a perfect match for your team.
Xperti vets skilled professionals with its unique talent-matching process.
Connect and engage with technology enthusiasts.
© Xperti.io All Rights Reserved
Privacy
Terms of use