Барометрическая формула в Java - Помощь - PullRequest
0 голосов
/ 20 февраля 2011

Я изучаю 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 ]

2 голосов
/ 20 февраля 2011

Установите Pb, Tb, Lb и Hb на 0, когда они объявлены, поэтому у вас есть значение по умолчанию.

Вы знаете, что ваш код никогда не получит входные данные для h, которые позволят им не устанавливать, но компилятор этого не делает. Они боятся, что они могут никогда не быть установлены!

2 голосов
/ 20 февраля 2011

Сообщение об ошибке говорит вам точно, что не так: вы не инициализируете все локальные переменные перед использованием. Так сделай это. Когда вы объявляете свои переменные, присваивайте им значение по умолчанию.

class Foo {
   public static void main(String[] args) {
     int foo = 0;  // initialized local variable
   }
}
1 голос
/ 20 февраля 2011

Более подробно: эта ветвь вашего ветвления с несколькими случаями является виновником:

    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);

Это позволяет избежать проблемы неинициализированной переменной , возвращаясь рано в случае ошибки.

1 голос
/ 20 февраля 2011

Поскольку Pb, Tb, Lb, Hb инициализируются только внутри блоков if, возможно, что все условия 'if' никогда не возникнут, и поэтому они будут выходить из блоков if без присвоения значения. Здесь может помочь последнее «else» или присвоение им значений перед блоком условных выражений.

0 голосов
/ 20 февраля 2011

двойной Pb, Tb, Lb, Hb;

изменить на

двойной Pb = 0,0, Tb = 0,0, Lb = 0,0, Hb = 0,0;

...