Ошибка NoSuchMethodError при компиляции исходного кода

#java

#java

Вопрос:

 class Box {
  double weight;
  double height;
  double depth;

  Box(Box ob){
    weight = ob.weight;
    height = ob.height;
    depth = ob.depth;
  }

  Box(double w, double h, double d){
    weight = w;
    height = h;
    depth = d;
  }

  Box() {
    weight = -1;
    height = -1;
    depth = -1;
  }

  Box(double len){
    weight = height = depth = len;
  }

  double volume(){
    return weight * height * depth; 
  }
}

 public class OverloadConss {
    public static void main(String[] args) {
            Box mybox1 = new Box (15,20,10);
            Box mybox2 =  new Box ();
            Box mycube = new Box(7);
            Box myclone =  new Box (mybox1);
            double vol;
            vol = mybox1.volume();
            System.out.println("The volume of the first box: "   vol);
            vol = mybox2.volume();
            System.out.println("The volume of the second box: "   vol);
            vol = mycube.volume();
            System.out.println("The volume of the mycube: "   vol);
            vol = myclone.volume();
           System.out.println("The clone of the mybox1:"   vol);
    }
}
  

Когда я компилирую исходный код, я получил сообщение:

Java / Eclipse / Исключение в потоке «main» java.lang.Ошибка NoSuchMethodError: поле.(LBox;)в OverloadConss.main(OverloadConss.java:33)

Комментарии:

1. какая строка является строкой 33? (Я предполагаю, что это: Box myclone = new Box (mybox1); )

2. Ddi вы помещаете весь исходный код (оба класса) в один и тот же файл? Если да, то вы назвали класс OverloadConss.java ?

Ответ №1:

С вашим кодом нет проблем; я запускаю его без каких-либо ошибок в eclipse. Вывод:

 The volume of the first box: 3000.0
The volume of the second box: -1.0
The volume of the mycube: 343.0
The clone of the mybox1:3000.0
  

Что вы используете для запуска скрипта? Если вы используете eclipse; попробуйте перестроить рабочее пространство или переписать файлы (копировать вставить).

Примечание: я бы использовал что-то подобное для Box.java таким образом, вам нужно изменить только 1 конструктор, если вы измените структуру данных.

 class Box {
  double weight;
  double height;
  double depth;

  Box(Box ob){
    this(ob.weight, ob.height, ob.depth);
  }

  Box(double w, double h, double d){
    weight = w;
    height = h;
    depth = d;
  }

  Box() {
    this(-1, -1, -1);
  }

  Box(double len){
    this(len, len, len);
  }

  // additional methods
}
  

Комментарии:

1. Да, то же самое для меня. Работает из Eclipse.

2. Первым конструктором должен быть Box(Box ob){ this(ob.вес, ob.высота, ob.глубина);}

3. Ну, я использую Eclipse в качестве IDE, но, похоже, у меня та же проблема.

4. то же самое с netbeans. Работает нормально.

Ответ №2:

Вы должны поместить разные классы в разные java-файлы, и это должно сработать.

Комментарии:

1. -1. Нет, в этом нет необходимости. В одном файле может быть несколько классов.

2. Это не всегда верно. Для каждого файла Java может быть только один общедоступный класс. Файл Java может содержать несколько других непубличных классов.

3. @vanje только один общедоступный класс верхнего уровня. Могут быть вложенные общедоступные классы, все в порядке.

4. В этом случае only OverloadConss является общедоступным классом, и поэтому оба они могут содержаться в одном файле.

5. @Hemal Pandya: Да, вы правы. Вложенные классы также могут быть общедоступными.

Ответ №3:

Если оба класса находятся в одном файле, я не понимаю, как это может произойти. OverloadConss.main вызывается Box конструктор, который определен.

Если они находятся в двух отдельных файлах, то я предполагаю, что вы добавили Box.Box(Box) их недавно и Box.java после этого не перекомпилировали. Java может получить доступ к некоторому классу Box, поэтому вы не получаете ClassNotFoundException

Лучше всего удалить все .class файлы и перекомпилировать.