java - 在java : java. lang.NumberFormatException中解析 float 时出现问题:对于输入字符串: "[60.0]"

标签 java

我调用一个方法来获取包含我需要的值的字符串。之后,我尝试将该字符串转换为带有 float 的数组列表。 这个想法是使用 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";
        }


     }


}

这是日志:

Información:   4:  String con ids
Información:   4:  Array con ids
Información:   ids :4
Información:   idp :4
Información:   ids parametro: :4
Información:   precioQ :[60.0]
Información:   idsList :[[60.0]]
Grave:   java.lang.NumberFormatException: For input string: "[60.0]"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
    at sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
    at java.lang.Float.parseFloat(Float.java:451)
    at java.lang.Float.valueOf(Float.java:416)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:545)
    at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
    at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438)
    at Controladores.CVentas.confirmarVenta(CVentas.java:139)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
    at java.lang.Thread.run(Thread.java:745)

最佳答案

您转换ListString ,它将您的值包装到 [] 中人物。那么这些字符会阻止您正确拆分列表。

不要这样做,只需返回 List 本身,或者将其事件强制转换为 List<String> 。然后您就可以更轻松地使用它:

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);
}

这也是没有意义的:

    vnt.setMonto(precioLista[i]);

因为i属于数组checkboxValores ,当您将它用于另一个数组时。不保证索引匹配。这很可能会产生 IndexOutOfBoundException当大小为checkboxValores时是2个或更多。

顺便说一句,如果您的 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.S.:发生异常时不要回滚事务,这可能会导致其他问题。

P.P.S.:正如您已经使用的 Spring Framework ,考虑使用JDBCTemplate - 它将帮助您避免常见错误。

关于java - 在java : java. lang.NumberFormatException中解析 float 时出现问题:对于输入字符串: "[60.0]",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60356553/

相关文章:

java - 集合子类型 - Liskov 替换原则

java - 在javadoc中实现opencv的clahe时需要解决我的错误

java - 从 DataBuffer 字节数组中获取 R G B 颜色

java - Android 中静态变量的替代品

java - 使用 MapsActivity 中的当前位置填充标记

Java Android 模拟器 : Crash when using Maps v2 (Caused by android. view.InflateException:二进制 XML 文件行 #11:错误膨胀类 fragment

java - (树莓派csi相机)用java从raspivid-stdout读取h264数据

java - 在Tomcat中创建mssql数据库jndi资源时出现异常

java - JPA 实体的自定义映射规则

java - 如何让 Hibernate 逆向工程工具为逆向关联生成 <bag> 或 <list>?