2013-10-01 4 views
0

Я написал код complex.java для комплексных чисел. Но он дает ошибку «Локальная переменная real может не быть инициализирована» на eclipse. Не могу понять, что случилось. Код выглядит следующим образом. Любая помощь будет оценена по достоинству.Локальная переменная real может не быть инициализирована

import java.lang.Math; 

public class Complex { 
    public double real; 
    public double comp; 

    Complex(double real, double comp) { 
    this.real = real; 
    this.comp = comp; 
    } 

    Complex() { 
    this.real = 0; 
    this.comp = 0; 
    } 


    public double getReal() { 
     return real; 
    } 

    public double getImg() { 
     return comp; 
    } 


    public Complex add(Complex a) { 
     return new Complex(a.getReal() + this.real, a.getImg() + this.comp); 
    } 


    public static Complex add(Complex a, Complex b) { 
     double real = a.real + b.real; 
     double comp = a.comp + b.comp; 
     Complex sum = new Complex(real, comp); 
     return sum; 
    } 

    public double getABS() { 
     return Math.sqrt(real*real + comp*comp); 
    } 

    public double getABSSqr() { /* get the squre of absolute */ 
     return (real*real + comp*comp); 
    } 


    public Complex mul(Complex a) { 
     return new Complex(a.getReal()*this.real-a.getImg()*this.comp, a.getReal()*this.comp+this.real*a.getImg()); 
    } 

    public static Complex mul(Complex a, Complex b) { 
     double real = a.real*b.real-a.comp*b.comp; 
     double comp = a.real*b.comp+b.real*a.comp; 
     Complex mul = new Complex(real, comp); 
     return mul; 
    } 

    public Complex squre() { 
     double real = real*real-comp*comp; //THIS IS WHERE ERROR APPEARS FOR real*real 
     double comp = 2*real*comp; //THIS IS WHERE ERROR APPEARS FOR comp     
     Complex squre = new Complex(real, comp); 
     return squre; 
    } 

    public void display() { 
    System.out.println(this.real + " + " + this.comp + "j"); 
    } 
} 
+2

Как вы думаете, это значит, если вы просто прочитать инструкцию об ошибке? –

+0

Поскольку это непреложный объект (хорошая идея!), Хорошей практикой было бы сделать два поля, реальные и comp, окончательные для ясности. – user949300

ответ

0

Отличный вопрос! В строке:

double real = real*real-comp*comp; 

реальная переменная, которая ссылается на real*real выражение на самом деле локальная real переменная, которую только что объявили, а не real поля объекта, как вы могли бы подумать. Локальная переменная имеет приоритет с точки зрения объема. Если вы хотите ссылаться на это поле, вам нужно будет использовать: this.real, чтобы быть в курсе того, о какой области вы говорите.

Например:

double real = this.real * this.real - this.comp * this.comp; 
double comp = 2 * this.real * this.comp; 

В качестве альтернативы, вы можете избежать проблем, используя различные имена для локальных переменных, так что компилятор не спутает:

double r = real * real - comp * comp; 
double c = 2 * real * comp; 
return new Complex(r, c); 

Или вы можете удалить временные переменные и поместить расчеты на одну строку:

public Complex square() { 
    return new Complex(real * real - comp * comp, 2 * real * comp); 
} 
+0

спасибо, проблема решена – user2835684

2

Вы должны использовать this.real и this.comp на РИТ этого заявления. Это потому, что у вас есть локальные переменные с тем же именем в этой области. Чтобы отличить их от переменных экземпляра, вам необходимо использовать this.

double real = this.real*this.real-this.comp*this.comp; 
double comp = 2*real*this.comp; // this.comp refers the instance variable comp and real refers the real declared in the previous line 

Поэтому, если вы просто дать real, он будет пытаться использовать real на самой левой стороне, которая неинициализированным еще и, таким образом, ошибка.

+0

спасибо, ошибка найдена и исправлена. – user2835684

0
double real = real*real-comp*comp; //THIS IS WHERE ERROR APPEARS FOR real*real 
    double comp = 2*real*comp; //THIS IS WHERE ERROR APPEARS FOR comp 

Это относится к той же заявленной переменной в левой части уравнения. Вам нужно сделать либо использовать другое имя для локальной переменной, либо использовать this.real * this.real с правой стороны.

+0

спасибо, действительно helful – user2835684

Смежные вопросы