在java:java.lang.NumberFormatException:For input string:;[60.0]”;

在java:java.lang.NumberFormatException:For input string:;[60.0]”;,java,Java,我正在调用一个方法来获取一个包含我需要的值的字符串。之后,我尝试将该字符串转换为带有浮点数的数组列表。 其思想是使用for来获取数组的位置,以提交每个值。 但问题是我遇到了这个错误: java.lang.NumberFormatException:对于输入字符串:“[60.0]” 这是我的代码: private String obtenerPrecios (String ids) { System.out.println("ids parametro: :" + ids);

我正在调用一个方法来获取一个包含我需要的值的字符串。之后,我尝试将该字符串转换为带有浮点数的数组列表。 其思想是使用for来获取数组的位置,以提交每个值。 但问题是我遇到了这个错误:

java.lang.NumberFormatException:对于输入字符串:“[60.0]”

这是我的代码:

private String obtenerPrecios (String ids) {
       System.out.println("ids parametro: :" + ids);
       try{

            Session session=HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();

            List<String> listaIds = new ArrayList<String>();
            //System.out.println("ids lista: :" + listaIds);
            List<String> idsList = Arrays.asList(ids.split(","));
           // System.out.println("idsList :" + idsList);
            List<Integer> iList = idsList.stream().map(Integer::valueOf).collect(Collectors.toList());
            //System.out.println("idsList int :" + iList);
            List result = session.createQuery("SELECT p.precioUnidad FROM Productos p WHERE p.id IN :stringIds").setParameterList("stringIds", iList).list();   
            //System.out.println("resutlado query :" + result);
            session.getTransaction().commit();
            session.close();

           // System.out.println("precios :" + result);
            //listaIds.toString();
           // System.out.println("lista a string :" + result.toString());
            return result.toString();

        }catch(Exception e){
            e.printStackTrace();
            return "error";
        }


   }




    @RequestMapping ( method = RequestMethod.POST )
    public String confirmarVenta (@RequestParam(value = "check", required = true) String checkboxValores,  Model model){

         System.out.println(checkboxValores +":  String con ids");

         try{
            Session session=HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();

            Venta vnt = new Venta();
            Productos prdcts = new Productos();

            int idVenta = generarID();

//            List ids = Arrays.asList(checkboxValores);
            System.out.println(checkboxValores +":  Array con ids");
//            List result = session.createQuery("from Productos where id=" + ids).list();
//            System.out.println(result + "result");
            for( int i=0; i < checkboxValores.length(); i++){
                System.out.println("ids :" + checkboxValores );
                int idP;
                String precioQ;

                idP = Character.getNumericValue(checkboxValores.charAt(i));
                System.out.println("idp :" + idP);
                precioQ = obtenerPrecios (checkboxValores);
                System.out.println("precioQ :" + precioQ);

                List<String> idsList = Arrays.asList(precioQ.split(","));

                System.out.println("idsList :" + idsList);

                Float [] precioLista = idsList.stream().map(Float::valueOf).toArray(Float[]::new);


//                System.out.println("precioLista : " +precioLista);
//                System.out.println("precioLista get clas : " +precioLista.getClass());
//                System.out.println("precioLista I: " +precioLista[i]);

                vnt.setFechaVenta(getCurrentDate());
                System.out.println(idVenta + ": id venta");
                vnt.setIdVenta(idVenta);
//                System.out.println(" precio posicion i: " + precioLista.get(i));
//                System.out.println(" precio posicion i get class: " + precioLista.get(i).getClass() );

                System.out.println("aca llega");
                vnt.setMonto(precioLista[i]);
                vnt.setIdProducto(idP);
                //vnt.setIdUsuario(id); pasar por url el id del empleado y pasarlo como parametro.
                session.save(vnt);
                model.addAttribute(vnt);
                session.getTransaction().commit();

            }
            session.close();
            return "transicionVenta";
         }catch(Exception e){
            e.printStackTrace();
            return"error";
        }


     }


}


列表
转换为
字符串
,该字符串将值包装为
[]
字符。然后,这些字符会阻止您正确拆分列表

不要这样做,只需返回列表本身,或将其事件强制转换到
列表
。这样,您就可以更轻松地进行操作:

private List<String> obtenerPrecios(String ids) {
    // ... your retrieval here ...
    return (List<String>) result;
}

@RequestMapping ( method = RequestMethod.POST )
public String confirmarVenta(@RequestParam(value = "check") String checkboxValores, Model model) {
    // ... your business logic here ...
    Float [] precioLista = obtenerPrecios(checkboxValores).stream()
        .map(Float::valueOf)
        .toArray(Float[]::new);
}
因为
i
属于数组
checkboxValores
,而您将它用于另一个数组。索引不能保证匹配。当
checkboxValores
的大小为2或更多时,很可能会产生
IndexOutOfBoundException

顺便说一下,如果您的SQL语句总是要返回一个值,您也可以只返回第一个值:

private String obtenerPrecios(String ids) {
    // ... your retrieval here ...
    if (result.size != 1) {
        throw new IllegalStateException("Single result is expected from database!");
    }
    return result.get(0);
}
注意:如果出现异常,您不会回滚事务,这可能会导致其他问题


<> P.P.S.:当你已经使用<代码> Spring Framework < /代码>时,考虑使用<代码> jdccDebug < /C> >它将帮助你避免常见错误。

尝试< <代码> >或>代码>双::值<代码> >列表IList= IDsList.Stand():map(整型::ValueOf).Cube(收藏家,TristIt());<代码>。将
Integer::valueOf
替换为我先前建议的内容。@Faraz例外情况说明输入包含
[
]
“[60.0]”“不是整数字符串。它是一个浮点数,因此应该使用
Double::valueOf
,而不是
Integer::valueOf
。但即使这样也会失败,因为
[60.0]
根本不是一个数字<代码>60.0是一个数字。所以你需要添加逻辑来删除方括号。@f1sh我刚才注意到了。你好@stepio,谢谢你,我用你给我的信息解决了这个问题。
    vnt.setMonto(precioLista[i]);
private String obtenerPrecios(String ids) {
    // ... your retrieval here ...
    if (result.size != 1) {
        throw new IllegalStateException("Single result is expected from database!");
    }
    return result.get(0);
}