简体   繁体   中英

Errors : Exception in thread “main” java.lang.Error: Unresolved compilation problems

I was watching a Java tutorial for beginners, and while writing the code I got a few errors:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    Syntax error, 'for each' statements are only available if source level is 1.5 or greater
    Arrays cannot be resolved
    Arrays cannot be resolved
    Arrays cannot be resolved

    at Animal.main(Animal.java:389)

My code is:

Animal.Java:

import java.util.Scanner;


// A class defines the attributes (fields) and capabilities (methods) of a real world object

public class Animal {

    // static means this number is shared by all objects of type Animal
    // final means that this value can't be changed
    public static final double FAVNUMBER = 1.6180;

    // Variables (Fields) start with a letter, underscore or $
    // Private fields can only be accessed by other methods in the class

    // Strings are objects that hold a series of characters
    private String name;

    // An integer can hold values from -2 ^ 31 to (2 ^ 31) -1
    private int weight;

    // Booleans have a value of true or false
    private boolean hasOwner = false;

    // Bytes can hold the values between -128 to 127
    private byte age;

    // Longs can hold the values between -2 ^ 63 to (2 ^ 63) - 1
    private long uniqueID;

    // Chars are unsigned ints that represent UTF-16 codes from 0 to 65,535
    private char favoriteChar;

    // Doubles are 64 bit IEEE 754 floating points with decimal values
    private double speed;

    // Floats are 32 bit IEEE 754 floating points with decimal values
    private float height;

    // Static variables have the same value for every object 
    // Any variable or function that doesn't make sense for an object to have should be made static
    // protected means that this value can only be accessed by other code in the same package
    // or by subclasses in other packages

    protected static int numberOfAnimals = 0;

    // A Scanner object allows you to except user input from the keyboard
    static Scanner userInput = new Scanner(System.in);

    // Any time an Animal object is created this function called the constructor is called
    // to initialize the object
    public Animal(){

        // Shorthand for numberOfAnimals = numberOfAnimals + 1;
        numberOfAnimals++;

        int sumOfNumbers = 5 + 1;
        System.out.println("5 + 1 = " + sumOfNumbers);

        int diffOfNumbers = 5 - 1;
        System.out.println("5 - 1 = " + diffOfNumbers);

        int multOfNumbers = 5 * 1;
        System.out.println("5 * 1 = " + multOfNumbers);

        int divOfNumbers = 5 / 1;
        System.out.println("5 / 1 = " + divOfNumbers);

        int modOfNumbers = 5 % 3;
        System.out.println("5 % 3 = " + modOfNumbers);

        // print is used to print to the screen, but it doesn't end with a newline \n
        System.out.print("Enter the name: \n");

        // The if statement performs the actions between the { } if the condition is true
        // userInput.hasNextLine() returns true if a String was entered in the keyboard
        if(userInput.hasNextLine()){

            // this provides you with a way to refer to the object itself
            // userInput.nextLine() returns the value that was entered at the keyboard
            this.setName(userInput.nextLine());

            // hasNextInt, hasNextFloat, hasNextDouble, hasNextBoolean, hasNextByte,
            // hasNextLong, nextInt, nextDouble, nextFloat, nextBoolean, etc.

        }

        this.setFavoriteChar();
        this.setUniqueID();

    }

    // It is good to use getter and setter methods so that you can protect your data
    // In Eclipse Right Click -> Source -> Generate Getter and Setters

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public boolean isHasOwner() {
        return hasOwner;
    }

    public void setHasOwner(boolean hasOwner) {
        this.hasOwner = hasOwner;
    }

    public byte getAge() {
        return age;
    }

    public void setAge(byte age) {
        this.age = age;
    }

    public long getUniqueID() {
        return uniqueID;
    }

    // Method overloading allows you to accept different input with the same method name
    public void setUniqueID(long uniqueID) {
        this.uniqueID = uniqueID;

        System.out.println("Unique ID set to: " + this.uniqueID);
    }

    public void setUniqueID() {

        long minNumber = 1;
        long maxNumber = 1000000;

        // Generates a random number between 1 and 1000000
        this.uniqueID = minNumber + (long)(Math.random() * ((maxNumber - minNumber) + 1));

        // You can cast from one primitive value into another by putting what you want between ( )
        // (byte) (short) (long) (double)
        // (float), (boolean) & (char) don't work.
        // (char) stays as a number instead of a character

        // You convert from a primitive to a string like this
        String stringNumber = Long.toString(maxNumber);

        // Byte.toString(bigByte); Short.toString(bigShort); Integer.toString(bigInt);
        // Float.toString(bigFloat); Double.toString(bigDouble); Boolean.toString(trueOrFalse);

        // You convert from a String to a primitive like this
        int numberString = Integer.parseInt(stringNumber);

        // parseShort, parseLong, parseByte, parseFloat, parseDouble, parseBoolean

        System.out.println("Unique ID set to: " + this.uniqueID);
    }

    public char getFavoriteChar() {
        return favoriteChar;
    }

    public void setFavoriteChar(char favoriteChar) {
        this.favoriteChar = favoriteChar;
    }

    public void setFavoriteChar() {

        int randomNumber = (int) (Math.random() * 126) + 1;

        this.favoriteChar = (char) randomNumber;

        // if then else statement
        // > < == != >= <=
        if(randomNumber == 32){

            System.out.println("Favorite character set to: Space");

        } else if(randomNumber == 10){

            System.out.println("Favorite character set to: New Line");

        } else {

            System.out.println("Favorite character set to: " + this.favoriteChar);

        }

        // Logical operators
        // ! : Converts the boolean value to its right to its opposite form ie. true to false
        // & : Returns true if boolean value on the right and left are both true (Always evaluates both boolean values)
        // && : Returns true if boolean value on the right and left are both true (Stops evaluating after first false)
        // | : Returns true if either boolean value on the right or left are true (Always evaluates both boolean values)
        // || : Returns true if either boolean value on the right or left are true (Stops evaluating after first true)
        // ^ : Returns true if there is 1 true and 1 false boolean value on the right or left

        if((randomNumber > 97) && (randomNumber < 122)){

            System.out.println("Favorite character is a lowercase letter");

        }

        if(((randomNumber > 97) && (randomNumber < 122)) || ((randomNumber > 64) && (randomNumber < 91))){

            System.out.println("Favorite character is a letter");

        }

        if(!false){

            System.out.println("I turned false to " + !false);

        }

        // The ternary operator assigns one or another value based on a condition
        int whichIsBigger = (50 > randomNumber) ? 50 : randomNumber;

        System.out.println("The biggest number is " + whichIsBigger);

        // The switch statement is great for when you have a limited number of values
        // and the values are int, byte, or char unless you have Java 7 which allows Strings
        switch(randomNumber){

        case 8 :
            System.out.println("Favorite character set to: Backspace");
            break;

        case 9 :
            System.out.println("Favorite character set to: Horizontal Tab");
            break;

        case 10 :
        case 11 :
        case 12 :
            System.out.println("Favorite character set to: Something else weird");
            break;

        default :
            System.out.println("Favorite character set to: " + this.favoriteChar);
            break;

        }

    }

    public double getSpeed() {
        return speed;
    }

    public void setSpeed(double speed) {
        this.speed = speed;
    }

    public float getHeight() {
        return height;
    }

    public void setHeight(float height) {
        this.height = height;
    }

    protected static int getNumberOfAnimals() {
        return numberOfAnimals;
    }

    // Since numberOfAnimals is Static you must set the value using the class name
    public void setNumberOfAnimals(int numberOfAnimals) {
        Animal.numberOfAnimals = numberOfAnimals;
    }

    protected static void countTo(int startingNumber){

        for(int i = startingNumber; i <= 100; i++){

            // continue is used to skip 1 iteration of the loop
            if(i == 90) continue;

            System.out.println(i);

        }

    }

    protected static String printNumbers(int maxNumbers){

        int i = 1;
        while(i < (maxNumbers / 2)){

            System.out.println(i);
            i++;

            // This isn't needed, but if you want to jump out of a loop use break
            if(i == (maxNumbers/2)) break;

        }

        Animal.countTo(maxNumbers/2);

        // You can return a value like this
        return "End of printNumbers()";

    }

    protected static void guessMyNumber(){

        int number;

        // Do while loops are used when you want to execute the code in the braces at least once
        do {

            System.out.println("Guess my number up to 100");

            // If what they entered isn't a number send a warning
            while(!userInput.hasNextInt()){

                String numberEntered = userInput.next();
                System.out.printf("%s is not a number\n", numberEntered);

            }
            number = userInput.nextInt();

        }while(number != 50);

        System.out.println("Yes the number was 50");

    }

    // This will be used to demonstrate polymorphism
    public String makeSound(){

        return "Grrrr";

    }

    // With polymorphism we can refer to any Animal and yet use overridden methods 
    // in the specific animal type
    public static void speakAnimal(Animal randAnimal){

        System.out.println("Animal says " + randAnimal.makeSound());

    }

    // public allows other classes to use this method
    // static means that only a class can call for this to execute 
    // void means it doesn't return a value when it finishes executing
    // This method can except Strings that can be stored in the String array args when it is executed

    public static void main(String[] args){

        Animal theDog = new Animal();

        System.out.println("The animal is named " + theDog.getName());

        System.out.println(Animal.printNumbers(100));

        Animal.countTo(100);

        Animal.guessMyNumber();

        // An array is a fixed series of boxes that contain multiple values of the same data type
        // How you create arrays
        // int[] favoriteNumbers;
        // favoriteNumbers = new int[20];

        int[] favoriteNumbers = new int[20];

        favoriteNumbers[0] = 100;

        String[] stringArray = {"Random", "Words", "Here"};

        // for(dataType[] varForRow : arrayName)
        for(String word : stringArray)
        {

            System.out.println(word);

        }

        // This is a multidimensional array
        String[][][] arrayName = { { { "000" }, { "100" }, { "200" }, { "300" } },
                 { { "010" }, { "110" }, { "210" }, { "310" } }, 
                 { { "020" }, { "120" }, { "220" }, { "320" } }};

        for(int i = 0; i < arrayName.length; i++)
        {
            for(int j = 0; j < arrayName[i].length; j++)
            {

                for(int k = 0; k < arrayName[i][j].length; k++)
                {
                    System.out.print("| " + arrayName[i][j][k] + " ");

                }
            }

            System.out.println("|");

        }

        // You can copy an array (stringToCopy, indexes to copy)
        String[] cloneOfArray = Arrays.copyOf(stringArray, 3);

        // You can print out the whole array
        System.out.println(Arrays.toString(cloneOfArray));

        // Returns the index or a negative number
        System.out.println(Arrays.binarySearch(cloneOfArray, "Random"));

    }
}

Dog.Java

public class Dog extends Animal{

    public Dog() {


    }

    // You can override Animal methods
    public String makeSound(){

        return "Woof";

    }

    public static void main(String[] args) {

        Dog fido = new Dog();

        fido.setName("Fido");

        System.out.println(fido.getName());

    }

}

Cat.java

    public static void main(String[] args) {

        Animal fido = new Dog();

        Animal fluffy = new Cat();

        // We can have an array of Animals that contain more specific subclasses
        // Any overridden methods are used instead because of polymorphism
        Animal[] theAnimals = new Animal[10];

        theAnimals[0] = fido;
        theAnimals[1] = fluffy;

        System.out.println("Fido says " + theAnimals[0].makeSound());
        System.out.println("Fluffy says " + theAnimals[1].makeSound());

        // We can also pass subclasses of Animal and they just work
        speakAnimal(fluffy);

    }

}

I saw a few other answers here and read that I had to add import java.util.Scanner;

Which i already had..

Please tell me the problem in the code... Thanks!

The issue is clear from the error message -

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    Syntax error, 'for each' statements are only available if source level is 1.5 or greater

You need java 1.5 or higher, You can download latest Java JDKs's from here


Or you can do as ultimate said, and make your loops compatible for lower versions of java (though I would suggest upgrading to above 1.5 , 1.5 is like very very old version anyway).

The line for(String word : stringArray) is a so called "for each" loop - a convenience added in Java 1.5.

But it seems your compiler is configued below 1.5, so it does not support the for each loop.

So you can either:

  • change the compiler level
  • change the loop to be 1.4 compatible to

     String[] stringArray = {"Random", "Words", "Here"}; String word; for(int i = 0; i < stringArray.length; i++) { word = stringArray[i]; System.out.println(word); } 

    (in fact this is what the compiler would do for you...)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM