【问题标题】:Variables in Methods don't save their value方法中的变量不保存它们的值
【发布时间】:2014-05-31 22:58:58
【问题描述】:

我遇到了 2 个变量的问题,其中第一个被称为 "Num_Viajes",每次我调用方法“de_Viaje”时,该函数都会将其值加一。第二个叫做“Total_Pasajeros”,函数是在它自己和另一个叫做“Num_Pasajeros”的变量之间做一个加法,两个变量都是int

无论如何,当我调用方法“Reporte_Final”时,两个变量都应该打印它们的结果,例如:如果我调用方法“de_Viaje”2 次并为变量“Num_Pasajeros”输入值“45”程序应该返回这个:

Num_Viajes = 2 Total_Pasajeros = 90

但相反,它返回:

Num_Viajes = 1 Total_Pasajeros = 45

所以我认为这是因为程序没有保存我的变量的值,所以它们总是重新启动。我该如何解决这个问题?

代码如下:

import javax.swing.*;

public class Empresa_Autobuses
{
    String Tipo_Vehiculo;
    String Analisis_Viaje;
    int Num_Pasajeros;
    int Num_Viajes;
    int Total_Pasajeros;
    int Prom_Pasajeros;

    public static void main(String ... args)
    {
        boolean Bandera_Falsa = true;
        Empresa_Autobuses Viajero = new Empresa_Autobuses();
        do
        {
            Viajero.de_Viaje();
            Viajero.Reporte_Viaje();
            Viajero.Solicitud_Viaje();
            Viajero.Reporte_Final();
        }while(Bandera_Falsa == true);
    }

    public void de_Viaje()
    {
        Empresa_Autobuses Viajero = new Empresa_Autobuses();
        Tipo_Vehiculo = JOptionPane.showInputDialog("Selecciona el Tipo de Autobus (G = Grande, P = Pequeño").toUpperCase();
        Num_Pasajeros = Integer.parseInt(JOptionPane.showInputDialog("Introduzca el Número de Pasajeros: "));
        if(Tipo_Vehiculo.equals ("G"))
        {
            if(Num_Pasajeros > 60)
            {
                JOptionPane.showMessageDialog(null, "¡Se ha superado la Capacidad Máxima del Autobus!");
                Viajero.Solicitud_Viaje();
            }
            else if(Num_Pasajeros >= 30)
            {
                Analisis_Viaje = "Ganancia";
                Num_Viajes++;
                Total_Pasajeros += Num_Pasajeros;
            }
            else
            {
                Analisis_Viaje = "Pérdida";
                Num_Viajes++;
                Total_Pasajeros += Num_Pasajeros;
            }
        }
        else if(Tipo_Vehiculo.equals ("P"))
        {
            if(Num_Pasajeros > 20)
            {
                JOptionPane.showMessageDialog(null, "¡Se ha superado la Capacidad Máxima del Autobus!");
                Viajero.Solicitud_Viaje();
            }
            else if(Num_Pasajeros >= 10)
            {
                Analisis_Viaje = "Ganancia";
                Num_Viajes++;
                Total_Pasajeros += Num_Pasajeros;
            }
            else
            {
                Analisis_Viaje = "Pérdida";
                Num_Viajes++;
                Total_Pasajeros += Num_Pasajeros;
            }
        }
        else
        {
            JOptionPane.showMessageDialog(null, "Opción Incorrecta");
            Viajero.Solicitud_Viaje();
        }
    }

    public void Reporte_Viaje()
    {
        JOptionPane.showMessageDialog(null, "Reporte de Viaje\nEl Tipo de Autobus fue: "+Tipo_Vehiculo+"\nEl Total de Pasajeros en el Viaje fue de: "+Num_Pasajeros+"\n"+Analisis_Viaje);
    }

    public void Solicitud_Viaje()
    {
        Empresa_Autobuses Viajero = new Empresa_Autobuses();
        String Solicitud;
        boolean flag = true;
        do
        {
            Solicitud = JOptionPane.showInputDialog("¿Quiere realizar otro Viaje? (Y/N)").toUpperCase();
            if(Solicitud.equals ("Y"))
            {
                Viajero.main();
            }
            else if(Solicitud.equals ("N"))
            {
                flag = true;
            }
            else
            {
                JOptionPane.showMessageDialog(null, "Opción Incorrecta");
                flag = false;
            }
        }while(flag == false);
    }

    public void Reporte_Final()
    {
        Prom_Pasajeros = Total_Pasajeros / Num_Viajes;
        JOptionPane.showMessageDialog(null, "El Número de Viajes realizados fue de: "+Num_Viajes+"\nEl Total de Pasajeros fue de: "+Total_Pasajeros+"\nEl Promedio de Pasajeros fue de: "+Prom_Pasajeros);
        System.exit(9999);
    }
}

【问题讨论】:

  • 尽量遵循 Java 命名约定。对方法/变量使用mixedCase,对类/接口使用CamelCase
  • 另外,退出状态为 9999 通常不是您想要的。通常,您应该让您的 main 方法完成,除非您处理的 GUI 东西处理退出的方式有所不同。
  • @dfeuer 我在“Reporte_Final”方法中使用 System.exit,因为那是我的程序的结尾,如果我把 Main 放在里面,程序不会结束。
  • @YulzCoreSux,这仍然不是正确的方法。见stackoverflow.com/questions/258099/…
  • @dfeuer 好的,我会检查的。

标签: java class variables methods


【解决方案1】:

问题似乎并不在您认为的地方。当Num_Pasajeros>60 时会发生什么?如果应该总是发生,为什么在“then”块内增加?

编辑

问题很可能是您在程序中运行main 过程。第二次调用创建了一个全新的对象,它与您一直在使用的对象无关!不要那样做,你应该没问题。您的 Swing 线程存在一些问题,但您可能不应该考虑这个问题。

【讨论】:

  • 好的,我也尝试将增量移动到另一种方法,但仍然无法正常工作,条件“Num_Pasajeros>60”用于丢弃添加的值,因为我在车辆类型 A 中的限制是 60 和B型是20。
  • 注意:即使调用 main 不是问题,它仍然几乎不是你想要做的。
  • 感谢您的解释,一开始我并没有很好地理解,但后来我意识到这是 main() 方法的递归问题。非常感谢您的帮助:)
【解决方案2】:

应该调试一下,断点@Empresa_Autobuses Viaajero = new Empresa_Autobuses();看看发生了什么情况(if/else 分支)正在运行/执行,你的变量实际值是什么......

无论如何,如果你仔细观察:如果护理类型是 P,那么你的 total_pasajeros 不会与 num pasarejos 相加。

Tipo_Vehiculo.equals ("P"))

对于 Java 代码约定 +1:http://web.archive.org/web/20140222045352/http://www.oracle.com/technetwork/java/codeconv-138413.html (如果你坚持这样做,你会让每个人的工作更轻松)

p.s:我不懂意大利语,但常识建议这些......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多