0

私はJavaを学んでおり、海抜のある高さでの気圧を計算するための非常に基本的な電卓を作成したいと考えていました。ただし、コードをビルドしようとするたびに、ローカル変数に関するエラーが発生します...初期化されていない可能性があります。

import javax.swing.JOptionPane;
import java.lang.Math;

class barometer {
public static void main(String args[]){

        String fn = JOptionPane.showInputDialog("Enter Height Above Sea Level in Metres:");

        double h = Integer.parseInt(fn);
        double R = 8.31432;
        double g0 = 9.80665;
        double M = 0.0289644;
        double Pb, Tb, Lb, Hb;
        String ans = "";

        if (h<0){
            ans = "error";
        } else if (h>=0 && h<11000){
            Pb = 101325.0;
            Tb = 288.15;
            Lb = -0.0065;
            Hb = 0.0;

        } else if (h>=11000 && h<20000){
            Pb = 22632.1;
            Tb = 216.65;
            Lb = 0.0;
            Hb = 11000.0;

        } else if (h>=20000 && h<32000){
            Pb = 5474.89;
            Tb = 216.65;
            Lb = 0.001;
            Hb = 20000.0;

        } else if (h>=32000 && h<47000){
            Pb = 868.019;
            Tb = 228.65;
            Lb = 0.0028;
            Hb = 32000.0;

        } else if (h>=47000 && h<51000){
            Pb = 110.906;
            Tb = 270.65;
            Lb = 0.0;
            Hb = 47000.0;

        } else if (h>=51000 && h<71000){
            Pb = 66.9389;
            Tb = 270.65;
            Lb = -0.0028;
            Hb = 51000.0;

        } else if (h>=71000){
            Pb = 3.95642;
            Tb = 214.65;
            Lb = -0.002;
            Hb = 71000.0;

        }


        double exp = ((-g0 * M * (h-Hb))/R * Tb);
        double press = Pb*Math.exp(exp);

        JOptionPane.showMessageDialog(null, "The answer is " +press+ans+"Pascals", "Barometric Formula", JOptionPane.PLAIN_MESSAGE);

}

}

では、このコードの何が問題なのですか?

4

5 に答える 5

2

PbTbLb、およびHbを宣言するときに 0 に設定して、デフォルトを設定します。

コードが h の入力を取得しないことはわかっていますが、h を設定できないようにしますが、コンパイラはそうしません。彼らが設定されないのではないかと心配しています!

于 2011-02-20T18:49:54.360 に答える
2

エラー メッセージは、何が問題なのかを正確に示しています。使用前にすべてのローカル変数を初期化していません。そうしてください。変数を宣言するとき、デフォルト値を与えます。

class Foo {
   public static void main(String[] args) {
     int foo = 0;  // initialized local variable
   }
}
于 2011-02-20T18:49:28.710 に答える
1

詳細: 複数ケース分岐のこの分岐が原因です:

    if (h<0){
        ans = "error";
    }

これが発生した場合、変数 Pb、Tb、Lb、Hb は初期化されませんが、showMessageDialog. したがって、この場合は初期化を行うだけで十分です。

    if (h<0){
        ans = "error";
        Pb = 0;
        Tb = 0;
        Lb = 0;
        Hb = 0;
    }

より良い方法は、ここで例外をスローする (そして後でキャッチする) ことですが、例外についてまだ学習していない場合は、最初に簡単な方法で実行してください。


現在の問題とは関係ありませんが、次のような配列を使用して長い「if-then-else-if-...」ステートメントを使用しなくても、プログラムをより適切に作成できます。

// minima of the intervals
double[] Hbs = {      0.0,  11000.0,  20000.0,  32000.0,   47000.0,   51000.0,   71000.0     };
// parameters for each interval
double[] Pbs = {101325.0,   22632.1,   5474.89,   868.019,   110.906,    66.9389,    3.95642 };
double[] Tbs = {   288.15,    216.65,   216.65,   228.65,    270.65,    270.65,    214.65    };
double[] Lbs = {    -0.0065,    0.0,      0.001,    0.0028,    0.0,      -0.0028,   -0.002   };

int h = ...

if(h < 0) {
   JOptionPane.showMessageDialog(null, "Don't use negative heights! (like " + h + ")", JOprionPane.ERROR_MESSAGE);
   return;
}

// find out in which interval is our height
int i = Hbs.length-1;
while(h < Hbs[i]) {
    i--;
}

double Hb = Hbs[i], Pb = Pbs[i], Tb = Tbs[i], Lb = Lbs[i];

double exp = ((-g0 * M * (h-Hb))/R * Tb);
double press = Pb*Math.exp(exp);

JOptionPane.showMessageDialog(null, "The answer is " +press+" Pascals", "Barometric Formula", JOptionPane.PLAIN_MESSAGE);

これにより、エラーが発生した場合に早期に戻ることで、初期化されていない変数の問題が回避されます。

于 2011-02-20T18:54:31.143 に答える
1

Pb、Tb、Lb、Hb は if ブロック内でのみ初期化されるため、すべての「if」条件が発生しない可能性があり、値が割り当てられずに if ブロックから出てきます。最後の「else」はそこで役立つか、条件ブロックの前に値を与えることができます。

于 2011-02-20T18:51:04.720 に答える
0

ダブルPb、Tb、Lb、Hb。

への変更

ダブル Pb = 0.0、Tb = 0.0、Lb = 0.0、Hb = 0.0;

于 2011-02-20T18:50:49.987 に答える