我想从txt文件中读取信息,封装成对象,但总是出现异常,求解决方法。控制台输出的内容如下:
八月 24, 2012 4:29:07 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [ImportGoodsServlet] in context with path [/WarehouseManagementSystem] threw exception
java.lang.NumberFormatException: For input string: "锘?23"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:441)
at java.lang.Long.parseLong(Long.java:483)
at com.zhanghan.controller.ImportGoodsServlet.doPost(ImportGoodsServlet.java:54)
at com.zhanghan.controller.ImportGoodsServlet.doGet(ImportGoodsServlet.java:30)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1770)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)以下是相关的函数或文件:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
GoodsBeanDao existedGBDao = new GoodsBeanDao();
BufferedReader reader = new BufferedReader(new FileReader("G:/我的程序/3.java/2.Myeclipse for j2ee/WarehouseManagementSystem/GoodsInfo.txt"));
String line = null;
while((line=reader.readLine())!=null)
{
String[] list = line.split(" ");
long goodsId = Long.parseLong(list[0].trim());//////这个地方出现的异常
String goodsName = list[1];
double goodsPrice = Double.parseDouble(list[2].trim());
long goodsNum = Long.parseLong(list[3].trim());
GoodsBean gb = new GoodsBean(goodsId, goodsName, goodsPrice, goodsNum);
existedGBDao.addGoods(gb);
}
request.getSession().setAttribute("existedGoods", existedGBDao);
request.getRequestDispatcher("find.jsp").forward(request, response);
}读取的txt文件中前几行内容如下:
223 悟空传 23.0 100
1002 穆斯林的葬礼 20.0 45
1003 平凡的世界 25.0 89还有,我保存txt时,编码为UTF-8,用Myeclipse看txt的属性时也是UTF-8的编码。
关键检查下txt里的回车,全角空格什么的。
String[] list = line.split(" ");
//////////////
for(int i =0;i<list.length;i++)
{
System.out.println(list[i]);
}
//////////
long goodsId = Long.parseLong(list[0].trim());
String goodsName = list[1];
double goodsPrice = Double.parseDouble(list[2].trim());
long goodsNum = Long.parseLong(list[3].trim());1111 wukongzhuan 90.0 90
打印的是:
锘?111
wukongzhuan
90.0
901111 悟空传 90.0 90
打印的是:
锘?111
鎮熺┖浼?90.0
90第一个数字和中文的总是乱码,是怎么回事???
打印的是:
锘?111
wukongzhuan
90.0
901111 悟空传 90.0 90
打印的是:
锘?111
鎮熺┖浼?90.0
90第一个数字和中文的总是乱码,是怎么回事???我用的是半角,一行中也不可能有回车的
G:/我的程序/3.java/ 这边 你换个路径试试
将字符流改为字节流中文乱码解决了,但还是有问题。public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
GoodsBeanDao existedGBDao = new GoodsBeanDao();
//下面这行修改过,将字符流改为了字节流
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("G:/GoodsInfo.txt"),"UTF-8"));
String line = null;
while((line=reader.readLine())!=null)
{
String[] list = line.split(" ");
//////////////
for(int i =0;i<list.length;i++)
{
System.out.println(list[i]);
}
//////////
long goodsId = Long.parseLong(list[0].trim());
String goodsName = list[1];
double goodsPrice = Double.parseDouble(list[2].trim());
long goodsNum = Long.parseLong(list[3].trim());
GoodsBean gb = new GoodsBean(goodsId, goodsName, goodsPrice, goodsNum);
existedGBDao.addGoods(gb);
}
request.getSession().setAttribute("existedGoods", existedGBDao);
request.getRequestDispatcher("find.jsp").forward(request, response);
}控制台输出如下:
八月 24, 2012 6:37:41 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [ImportGoodsServlet] in context with path [/WarehouseManagementSystem] threw exception
java.lang.NumberFormatException: For input string: "?1111"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:441)
at java.lang.Long.parseLong(Long.java:483)
at com.zhanghan.controller.ImportGoodsServlet.doPost(ImportGoodsServlet.java:63)
at com.zhanghan.controller.ImportGoodsServlet.doGet(ImportGoodsServlet.java:32)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1770)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)?1111
悟空传
90.0
90读取的文件内容如下:
1111 悟空传 90.0 90不知怎么的1111前多了个问号。而且Myeclipse内浏览器页面报错也不同于控制台。浏览器报错内容如下:
HTTP Status 500 - For input string: "1111"--------------------------------------------------------------------------------type Exception reportmessage For input string: "1111"description The server encountered an internal error (For input string: "1111") that prevented it from fulfilling this request.exception java.lang.NumberFormatException: For input string: "1111"
java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
java.lang.Long.parseLong(Long.java:441)
java.lang.Long.parseLong(Long.java:483)
com.zhanghan.controller.ImportGoodsServlet.doPost(ImportGoodsServlet.java:63)
com.zhanghan.controller.ImportGoodsServlet.doGet(ImportGoodsServlet.java:32)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.29 logs.
--------------------------------------------------------------------------------Apache Tomcat/7.0.29