Java acm ComplexNumber Class не может быть создан? - PullRequest
0 голосов
/ 02 декабря 2018

Может ли кто-нибудь помочь мне выяснить, почему мой код не работает?Я буквально понятия не имею, почему это не сработает.В нем говорится java.lang.InstantiationException, и каждый пост, который я ищу в Интернете, говорит мне, что абстрактные классы не могут быть созданы, но это не абстрактный класс, или я ошибаюсь?

import acm.program.ConsoleProgram;

public class ComplexNumber extends ConsoleProgram{

    double re;
    double im;
    double a1;
    double a2;
    double b1;
    double b2;

    public ComplexNumber(double real, double imaginary) {
        double re = real;
        double im = imaginary;
    }

public ComplexNumber(ComplexNumber cn) {
    double re = getReal();
    double im = getImaginary();
}

    private double getReal() {
        return re;
    }

    private double getImaginary() {
        return im;
    }

    public String toString() {
        return "" + re + " " + im + "*i";
    }

    private ComplexNumber add(ComplexNumber cn2) {
        a1 = re;
        a2 = cn2.getReal();
        b1 = im;
        b2 = cn2.getImaginary();
        return new ComplexNumber(a1+a2,b1+b2);
    }

    @Override
    public void run() {
        ComplexNumber cn1 = new ComplexNumber(1.0, 2.0);
        ComplexNumber cn2 = new ComplexNumber(3.0, 4.0);
        cn1.add(cn2).toString();
    }
}

Я был бы очень признателенесли кто-нибудь может мне помочь.

java.lang.InstantiationException: ComplexNumber Laden: ComplexNumber.class kann nicht instanziiert werden. 
  at java.lang.Class.newInstance(Unknown Source) 
  at sun.applet.AppletPanel.createApplet(Unknown Source) 
  at sun.applet.AppletPanel.runLoader(Unknown Source) 
  at sun.applet.AppletPanel.run(Unknown Source) 
  at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.NoSuchMethodException: ComplexNumber.<init>() 
  at java.lang.Class.getConstructor0(Unknown Source) ... 5 mor

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Кажется, проблема в том, что вы используете этот класс в качестве апплета.Ваш браузер (или любой другой апплет, который вы используете) пытается создать экземпляр ComplexNumber без передачи аргументов конструктору.Но у вашего ComplexNumber класса нет подходящего конструктора - у вас есть одна версия с двумя параметрами double и другая с параметром ComplexNumber.Но вам нужен один без параметров вообще.Может быть, что-то вроде

public ComplexNumber() {
    re = 0.0;
    im = 0.0;
}

Вам также следует внести исправления, предложенные в ответе Джорджа Зужаноса - без них ваш класс все еще не работает.

0 голосов
/ 02 декабря 2018

Внутри вашего конструктора (обоих) вы объявляете новые переменные, которые являются локальными.Это означает, что поле с именем «re» не получает никакого значения, поэтому получатель попытается вернуть неинстанцированное поле.

Проверьте этот класс с помощью правильного объявления поля / переменной (некоторые дополнительные комментариивнутри кода :))

public class ComplexNumber extends ConsoleProgram {
    double re;
    double im;

    public ComplexNumber(double real, double imaginary) {
        re = real;
        im = imaginary;
        // double re = real will declare new local variable. So the field
        // this.re will never get a value.
    }

    public ComplexNumber(ComplexNumber cn) {
        // Alternative constructor will use the original constructor.
        this(cn.getReal(), cn.getImaginary());
    }

    private double getReal() {
        return re;
    }

    private double getImaginary() {
        return im;
    }

    public String toString() {
        return "" + re + " " + im + "*i";
    }

    private ComplexNumber add(ComplexNumber cn2) {
        // a1,a2,b1,b2 variables can be local, no need to be fields.
        double a1 = re;
        double a2 = cn2.getReal();
        double b1 = im;
        double b2 = cn2.getImaginary();
        return new ComplexNumber(a1 + a2, b1 + b2);
    }

    @Override
    public void run() {
        ComplexNumber cn1 = new ComplexNumber(1.0, 2.0);
        ComplexNumber cn2 = new ComplexNumber(3.0, 4.0);
        cn1.add(cn2).toString();
    }
}
...