QA@IT

このエラーはどうすれば・・・

3301 PV

public class Program {
public void output() {
int a,b,c;
double re1, re2, im1,im2, D;

          a = 2;
          b = -5;
          c = 2;

          D=b * b - 4 * a * c;
          if (D > 0) {
              re1 = (-b + Math.sqrt(D)) / (2 * a);
              re2 = (-b - Math.sqrt(D)) / (2 * a);
              im1 = 0;
              im2 = 0;
          } else if (D == 0) {
               re1 = -b / (2 * a);
               im1 = 0;
          } else {
               re1 = re2 = -b / (2*a);
               im1 = im2 = Math.sqrt(-D) / (2 * a);
          }

          if (D == 0) {
              System.out.println("x = " + re1 + " + " + im1 + "i");
          } else {
          System.out.println("x = " + re1 + " + " + im1 + "i, "
                                      + re2 + " + " + im2 + "i");
          }
   }
   public static void main(String[] args) {
          Program p = new Program();
          p.output();
    }

}

Message

Program.java:28: error: variable re2 might not have been initialized
+ re2 + " + " + im2 + "i");
^
Program.java:28: error: variable im2 might not have been initialized
+ re2 + " + " + im2 + "i");
^
2 errors

他のサイトできいたところ無下にされたので再質問です。
自分で何度も調べましたがよくエラーの意味が理解できません。
eclipseに書いてあった通り、
上から4行目をre2=0,im2=0にしましたが、解決できませんでした。
どうすればいいでしょうか。

  • 文字、数値...

    型から勉強したほうがいいかもしれませんね。
    -
  • 実はこれは左から右に写す課題なので、勉強するも何も最近やり始めたものです。だから型を習っている最中です。エラーの理由をどうか教えて貰えませんか? -
  • 計算が分けて書かれていないのは仕様です。

    -
  • 一度分けて書いて提出してみます。ありがとうございました。 -

回答

上から4行目をre2=0,im2=0にしましたが、解決できませんでした。

これはどのようにしましたか?

以下の様であればコンパイルエラーは回避できますが、

double re1, re2 = 0, im1, im2 = 0, D;

re2とim2は隣同士ではないので

double re1, re2 = 0, im1 = 0, im2, D;

とか

double re1, re2 = 0, im2 = 0, D;

になっていませんか?
どんなエラーがでますか?

私の環境では最初に書いたやり方で

x = 2.0 + 0.0i, 0.5 + 0.0i

と出ます。

0を代入しているからエラーの意味はわかっているような気もしますが
修正前のプログラムでは、} else if (D == 0) { に入った場合に re2,im2に何も入らない状況が発生します。

すると、

System.out.println("x = " + re1 + " + " + im1 + "i, "
   + re2 + " + " + im2 + "i");

で何も入っていないre2を使おうとしているのでコンパイルエラーになります。

作り手としては D==0という予防線を張っているつもりですが、最初の ifブロックと次のifブロックは互いに独立してますので、その間に Dが0になる可能性が絶対無いとは言い切れないのでコンパイルエラーになっています。

例えば、以下の様なケースですね。

              D=b * b - 4 * a * c;
              if (D > 0) {
                   // 省略
              } else if (D == 0) {
                   re1 = -b / (2 * a);
                   im1 = 0;
                   D=1;
              } else {
                   // 省略
              }

              if (D == 0) {
                  System.out.println("x = " + re1 + " + " + im1 + "i");
              } else {
                  System.out.println("x = " + re1 + " + " + im1 + "i, "
                                          + re2 + " + " + im2 + "i");
              }

コンパイラは実行してみているわけではないので、その可能性があるルートを見つけるとコンパイルエラーとする場合があります。

逆に以下の様なコードであれば、使う前にre2が初期化されないことはないのでコンパイルエラーにはなりません。

public class Program {
    public void output() {
        int a,b,c;
        double re1, re2, im1, im2, D;

        a = 2;
        b = -5;
        c = 2;

        D=b * b - 4 * a * c;
        if(D==0){
            re1 = -b / (2 * a);
            im1 = 0;
            System.out.println("x = " + re1 + " + " + im1 + "i");
        }else{
            if(D > 0){
                re1 = (-b + Math.sqrt(D)) / (2 * a);
                re2 = (-b - Math.sqrt(D)) / (2 * a);
                im1 = 0;
                im2 = 0;
            } else {
                // D < 0
                re1 = re2 = -b / (2*a);
                im1 = im2 = Math.sqrt(-D) / (2 * a);
            }
            System.out.println("x = " + re1 + " + " + im1 + "i, "
                    + re2 + " + " + im2 + "i");
        }
    }
    public static void main(String[] args) {
        Program p = new Program();
        p.output();
    }
}
編集 履歴 (1)
  • 丁寧な説明ありがとうございました。
    とどのつまり、作った側に問題があったということでしょうか?
    何にせよ解決できそうです。ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。