Java中的气压公式 - 帮助

时间:2011-02-20 18:47:47

标签: java syntax-error local-variables initialization

我正在学习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);

}

}

这个代码有什么问题?

5 个答案:

答案 0 :(得分:2)

错误消息告诉您确切的错误:在使用之前不要初始化所有局部变量。这样做吧。当您声明变量时,它们会为它们提供默认值。

class Foo {
   public static void main(String[] args) {
     int foo = 0;  // initialized local variable
   }
}

答案 1 :(得分:2)

PbTbLbHb设置为0时,将其设为默认值。

您知道您的代码永远不会获得h的输入,这将使它们不被设置,但编译器不会。它担心它们可能永远不会被设定!

答案 2 :(得分:1)

因为Pb,Tb,Lb,Hb仅在块内部初始化,所以'if'条件可能永远不会出现,因此它们会在没有赋值的情况下从if块中出来。最终的'else'可以帮助那里,或者在条件块之前给它们值。

答案 3 :(得分: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);

这可以通过在出现错误的情况下提前返回来避免未初始化的变量问题。

答案 4 :(得分:0)

  

双Pb,Tb,Lb,Hb;

更改为

  

双Pb = 0.0,Tb = 0.0,Lb = 0.0,Hb   = 0.0;