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

错误消息准确地告诉您出了什么问题:您没有在使用前初始化所有局部变量。就这样做吧。当你声明你的变量时,给它们一个默认值。

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

在声明它们时将PbTbLb和设置为 0,这样您就有了默认值。Hb

您知道您的代码永远不会得到 h 的输入,这会让它们无法设置,但编译器不会。它担心他们可能永远不会被设置!

于 2011-02-20T18:49:54.360 回答
1

因为 Pb、Tb、Lb、Hb 仅在 if 块内初始化,所以所有“if”条件可能永远不会出现,因此它们会出现在 if 块中而没有被赋值。最后的“else”可以在那里提供帮助,或者在条件块之前给它们值。

于 2011-02-20T18:51:04.720 回答
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 回答
0

双 Pb、Tb、Lb、Hb;

改成

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

于 2011-02-20T18:50:49.987 回答