使用扫描仪输入

时间:2018-04-19 18:07:18

标签: java arraylist java.util.scanner

我正在通过一个小项目进行实习,该项目要求用户选择一类费用,以便稍后请求存储在ArrayList中的数量,最后在屏幕上打印该类别的总费用金额。问题发生在我将变量'quantity'与Scanner条目相关联的那一刻,此时执行线程仍处于Execution状态,并且它不会返回任何类型的错误。

package gestioneconomica;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.Scanner;
    /**
     *
     * @author Robin
     */
     class Gastos {
        //Declaración de los tipos de gastos organizados en ArrayList()  

        ArrayList<Double> taberna=new ArrayList<>();
        ArrayList<Double> tPublico=new ArrayList<>();
        ArrayList<Double> alimentacion=new ArrayList<>();
        ArrayList<Double> formacion=new ArrayList<>();
        //Declaración e inicialización de la suma de los valores de cada ArrayList()
        double sumTaberna=0.0;
        double sumTPublico=0.0;
        double sumAlimentacion=0.0;
        double sumFormacion=0.0;

        //Instanciación del objeto 'sc' de la clase Scanner
        Scanner sd=new Scanner(System.in);
    //*************THE NEXT LINE CAUSES THE ERROR****************
        double quantity=sd.nextDouble();
        //Declaración e inicialización de métodos
        public void addTaberna(){
    System.out.print("Ingrese importe: ");
    while(quantity!=0){
        taberna.add(quantity);
    }
    System.out.print("El total consumido en esta categoría es de: ");
    Iterator <Double> itTaberna=taberna.iterator();
    while(itTaberna.hasNext()){
        System.out.println(itTaberna.next());
    }

}
public void addtPublico(){
    System.out.print("Ingrese importe: ");
    while(quantity!=0){
        tPublico.add(quantity);
    }
    Iterator <Double> itTPublico=tPublico.iterator();
    while(itTPublico.hasNext()){
        sumTPublico+=itTPublico.next();
    }
    System.out.println("Gastos totales en Transporte Público: " + sumTPublico);
                }
        public void addAlimentacion(){
            System.out.print("Ingrese importe: ");
            alimentacion.add(sd.nextDouble());
        }
        public void addFormacion(){
            System.out.print("Ingrese importe: ");
            formacion.add(sd.nextDouble());
        }
    }




//THIS IS THE DRIVER CLASS

package gestioneconomica;
import java.util.Scanner;


class GastosExe{
    public static void main(String[]args){

        System.out.println("###################################################");
        System.out.println("BIENVENIDO/A AL PROGRAMA DE GASTOS DE ROBIN");
        System.out.println("###################################################");
        System.out.println("(1)TABERNA\t(2)TRANSPORTE PÚBLICO\t(3)ALIMENTACIÓN\t (4)INVERSIÓN FORMATIVA"); 
        System.out.println("Seleccione el tipo de Gasto: ");

        Gastos gastos=new Gastos();
        Scanner sc=new Scanner(System.in);


        int tipo=sc.nextInt();
        switch(tipo){
            case 1:
                System.out.println("Ha seleccionado Taberna");
                gastos.addTaberna();

                break;
            case 2:
                System.out.println("Ha seleccionado Transporte Público");

                break;
            case 3:
                System.out.println("Ha seleccionado Alimentación");
                gastos.addAlimentacion();
                break;
            case 4:
                System.out.println("Ha seleccionado Inversión Formativa");
                gastos.addFormacion();
                break;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

欢迎来到SO。这是一个非常好的第一个问题。

  

在那一刻,执行线程仍处于执行状态,确实如此   不返回任何类型的错误

那是因为这里没有错误。正确的术语是#34;目前执行线程(主线程)仍然被阻止&#34;您的程序的行为与您对其进行编码的行为完全相同

让我们从主方法中分解出来。

Gastos gastos=new Gastos();

当您在main方法上调用Gastos构造函数时,Gastos类初始化,其具有double类型的quantity字段,直接使用Scanner的输入进行初始化。

当执行到达此行double quantity = sd.nextDouble(); 时,它会阻塞主线程,等待来自用户的键盘输入..

所以你应该在这里输入一个选择1

按Enter键时,sd.nextDouble();方法返回,主线程恢复。

然后,当Gastos()构造函数调用返回并且主线程到达此行int tipo = sc.nextInt();

哪个再次阻止主线程,等待用户的另一个键盘输入。

所以你应该再次在这里输入一个选择2

按Enter键时,sc.nextInt();方法返回,主线程恢复执行

示例运行

###################################################
BIENVENIDO/A AL PROGRAMA DE GASTOS DE ROBIN
###################################################
(1)TABERNA  (2)TRANSPORTE PÚBLICO   (3)ALIMENTACIÓN  (4)INVERSIÓN FORMATIVA
Seleccione el tipo de Gasto: 
1
2
Ha seleccionado Transporte Público

答案 1 :(得分:0)

尝试:

 @Repository
 @Component
 public class AplicationDocumentDao extends JdbcDaoSupport {

@Autowired
public void setJT(JdbcTemplate jdbcTemplate) {
     setJdbcTemplate(jdbcTemplate);
}

public List<ApplicationDocumentBean> allForOrg(int orgId) {
    String sql = "SELECT * FROM ApplicationDocument WHERE organizationId = ?";
    return (List<ApplicationDocumentBean>) getJdbcTemplate().query(sql, new BeanPropertyRowMapper<ApplicationDocumentBean>(ApplicationDocumentBean.class), orgId);
}

}