Более подробно: эта ветвь вашего ветвления с несколькими случаями является виновником:
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);
Это позволяет избежать проблемы неинициализированной переменной , возвращаясь рано в случае ошибки.