我正在通过一个小项目进行实习,该项目要求用户选择一类费用,以便稍后请求存储在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;
}
}
}
答案 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);
}
}