Java 拆分为字符串数组时出现空指针异常
所以我试图从一个文件读取器中填充两个数组。我认为这需要嵌套循环。我想我走对了方向,但从昨天起我就有点困了。此程序的目的是通过jsp启动程序,并动态读取值。任何帮助都将不胜感激。我想我走对了方向,但我似乎无法独自完成。fxRates.csv的第一行应填充到currencyCodes数组中,其余行应填充到二维数组fxExchangeRates中。我得到的代码没有任何错误,但现在我得到的是当我尝试运行程序时: 以下是错误日志:Java 拆分为字符串数组时出现空指针异常,java,jsp,multidimensional-array,nullpointerexception,filereader,Java,Jsp,Multidimensional Array,Nullpointerexception,Filereader,所以我试图从一个文件读取器中填充两个数组。我认为这需要嵌套循环。我想我走对了方向,但从昨天起我就有点困了。此程序的目的是通过jsp启动程序,并动态读取值。任何帮助都将不胜感激。我想我走对了方向,但我似乎无法独自完成。fxRates.csv的第一行应填充到currencyCodes数组中,其余行应填充到二维数组fxExchangeRates中。我得到的代码没有任何错误,但现在我得到的是当我尝试运行程序时: 以下是错误日志: Info: visiting unvisited reference
Info: visiting unvisited references
Info: visiting unvisited references
Info: visiting unvisited references
Warning: Ignore WEB-INF/sun-web.xml in archive /G:/School/Java II/Labs/MidtermAD/build/web/, as WLS counterpart runtime xml WEB-INF/glassfish-web.xml is present in the same archive.
Info: Loading application [MidtermAD] at [/MidtermAD]
Info: MidtermAD was successfully deployed in 464 milliseconds.
Warning: StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at java.lang.String.split(String.java:2337)
at java.lang.String.split(String.java:2422)
at data.FxDataModel.<init>(FxDataModel.java:38)
at org.apache.jsp.fxCalc_jsp.jspInit(fxCalc_jsp.java:45)
at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:92)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:210)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377)
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:415)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
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:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
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:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
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:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)
fxRates.csv文件还包含以下代码:
CAD,EUR,GBP,USD
1.0,0.624514066,0.588714763,0.810307
1.601244959,1.0,0.942676548,1.2975
1.698615463,1.060809248,1.0,1.3764
1.234100162,0.772200772,.726532984,1.0
在FxDataModel.Java类中
您将属性引用声明为private properties fxProps代码>
但您没有为对象指定属性。默认情况下,它被分配了null
,在您调用的fxProps.getProperty(FX\u RATES\u FILE\u DLMTR\u KEY)的空值上代码>。因此,JVM在运行时抛出NullPointerException
解决方案:
private Properties fxProps = new Properties();
fxProps .setProperty(FX_RATES_FILE_DLMTR_KEY,"fx.rates.file.dlmtr");
private String delimiter = fxProps.getProperty( FX_RATES_FILE_DLMTR_KEY );
太多的代码。仅提供相关内容。可以谢谢我删除了一些内容并缩小了问题的范围。您从未使用任何值填充fxProps
属性。TL;博士可能重复的话题:你应该让你的。。。了解情况。检查FxDataModel.Java的更新。我按照你的建议做了,但仍然得到一个NullPointerException。它总是指向第38行,也就是我使用分隔符拆分文件的第一行时。这里是您的示例:String delimiter=fxProps.getProperty(FX_RATES_FILE_DLMTR_KEY);//返回null fxCurrences=reader.nextLine().split(分隔符);所以,这个拆分(null)方法抛出NullPointerException。但分隔符怎么可能是null呢。我将其设置为String delimiter=fxProps.getProperty(FX\u RATES\u FILE\u DLMTR\u KEY);就像你告诉我的那样,我发起了fxProps。是否还有其他原因导致该值为null?是的,您提供的分隔符值为null。(fxProps.getProperty(FX\u RATES\u FILE\u DLMTR\u KEY)返回null)这就是它引发异常的原因。我该如何修复它?为什么(fxProps.getProperty(FX\u RATES\u FILE\u DLMTR\u KEY)没有从文件返回值?它甚至定义为:公共静态最终字符串FX\u RATES\u FILE\u DLMTR\u KEY=“FX.RATES.FILE.DLMTR”;这就是为什么我如此困惑。
<%@include file="fxInit.jsp"%>
<%
Properties fxProps = fxDataModel.getFxProps();
String srcAmtName = fxProps.getProperty(FxDataModel.SRC_AMT_KEY );
String dstAmtName = fxProps.getProperty(FxDataModel.DST_AMT_KEY );
String srcCucyName = fxProps.getProperty(FxDataModel.SRC_CUCY_KEY );
String dstCucyName = fxProps.getProperty(FxDataModel.DST_CUCY_KEY );
String Curr1 = request.getParameter(srcAmtName);
String Curr2 = request.getParameter(dstAmtName);
String formInput;
String formOutput;
String[] currencies = fxDataModel.getFxCurrencies();
try {
formInput = request.getParameter(srcAmtName);
Double formDouble = Double.parseDouble(formInput);
Double Conversion = fxDataModel.getFxRate(Curr1,Curr2)*formDouble;
formOutput = String.valueOf(Conversion);
} catch (NumberFormatException ex) {
Curr1= Curr2 = currencies[0];
formInput = ("");
formOutput = ("");
} catch (NullPointerException npe){
Curr1= Curr2 = currencies[0];
formInput = ("");
formOutput = ("");
}
%>
<html>
<head>
<title>F/X Calculator</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<style>
h1{
color: white;
font-family: verdana;
font-size: 200%;
font-style: italic;
text-align: center;
}
hr{
color:white;
}
select{
margin-top: 30px;
margin-right:10px;
}
input{
margin-top: 30px;
margin-right:10px;
}
</style>
<body bgcolor = "blue">
<h1>
Money Banks F/X Calculator<br>
</h1>
<hr>
<div align="center">
<form name ="fxCalc" action="fxCalc.jsp" method="POST">
<select name="<%=srcCucyName%>">
<% for (String currency : currencies) { %>
<option value="<%=currency%>" <%=currency.equals(Curr1)?"selected":""%>><%=currency%></option>
<%}%>
</select>
<input name="<%=srcAmtName%>" type="text" value = <%=formInput%> >
<select name="<%=dstCucyName%>">
<% for (String currency : currencies) { %>
<option value="<%=currency%>" <%=currency.equals(Curr2)?"selected":""%>><%=currency%></option>
<%}%>
</select>
<input name="<%=dstAmtName%>" type="text" disabled="disabled" value = <%=formOutput%>>
<br>
<input name="submitbutton" type="submit" value="Convert" name="Convert"/>
<input name="resetbutton" type="reset" value="Reset"/>
<form/>
<div/>
</body>
</html>
dst.amt=dstAmt
dst.cucy=dstCucy
fx.rates.file.dlmtr=,
fx.rates.file.name=/WEB-INF/fxRates.csv
src.amt=srcAmt
src.cucy=srcCucy
CAD,EUR,GBP,USD
1.0,0.624514066,0.588714763,0.810307
1.601244959,1.0,0.942676548,1.2975
1.698615463,1.060809248,1.0,1.3764
1.234100162,0.772200772,.726532984,1.0
private Properties fxProps = new Properties();
fxProps .setProperty(FX_RATES_FILE_DLMTR_KEY,"fx.rates.file.dlmtr");
private String delimiter = fxProps.getProperty( FX_RATES_FILE_DLMTR_KEY );