webForumDet fria alternativet

konvertera string till int

9 svar · 1 387 visningar · startad av rollo

rolloMedlem sedan aug. 2001203 inlägg
#1

Tjena!

Jag sitter och meckar med en webshop och skall modifiera ett värde

Värdet finns i denna variablen header.getNetValue(), men när jag försöker konvertera till int, så blir det syntax error (dessvärre så ser jag inte felet).

int num=Integer.parseInt(header.getNetValue()); ger alltså syntax error, hur tusan får jag det till integer så att jag kan multiplicera värdet???

Tack på förhand!

rollo

SPiNMedlem sedan mars 20005 832 inlägg
#2

Är värdet helt numeriskt? Fångar du exceptions någonstans?

int num;
try {
     num = Integer.parseInt(header.getNetValue());
} catch(NumberFormatException e) {
     /* Inte bara siffror i strängen */
}
rolloMedlem sedan aug. 2001203 inlägg
#3

Värdet är en summa, så det bör vara numeriskt.

Enda gången jag kan fånga värdet är om jag gör
String rollo = header.getNetValue();

försöker jag göra det till int istället så krashar sidan

rollo

spangoMedlem sedan juni 20006 147 inlägg
#4

Om Integer.parseInt "kraschar" torde det antagligen bero på en av två saker:

  1. header.getNetValue() returnerar null, vilket orsakar NullPointerException i parseInt; eller
  2. du skickar in en sträng som inte är ett giltigt tal och får därmed NumberFormatException.

Går dock inte att säga mer utan att veta vilket exception som kastas.

rolloMedlem sedan aug. 2001203 inlägg
#5

ok, jag får försöka jaga rätt på felet på något sätt.

Jag ser att värdet är 0.00 i vart fall om det kan vara någon hjälp.

(är det nu ni säger; "för fan, det där skulle du sagt från början!!!")

rollo

spangoMedlem sedan juni 20006 147 inlägg
#6

Japp :)
0.00 är inte ett heltal utan ett flyttal och är således inte kosher indata till parseInt... du får använda någon form av flyttal, som double.

double num;
try {
     num = Double.parseDouble(header.getNetValue());
} catch(NumberFormatException e) {
     /* Inte bara siffror i strängen */
}
rolloMedlem sedan aug. 2001203 inlägg
#7

:l solly!

Jag kör med din kod

double num;
try {
	 num = Double.parseDouble(header.getNetValue());
} catch(NumberFormatException e) {
	 /* Inte bara siffror i strängen */
	out.println("NEJ!");	 
}

och försöker skriva ut värdet med <%=num%>, men det dumpar.

Jag har hittat en log som verkar ge mig ett felet.

Jan 15, 2008 8:16:16 AM,409 SAPEngine_Application_Thread[impl:3]_39 Error bbcom.sapmarkets.isa.core.ActionServlet [released|system.exception] An exception has occurred: {0}
com.sap.engine.services.servlets_jsp.server.jsp.exceptions.CompilingException: Error while executing the compilation process: [C:/usr/sap/QD1/JC00/j2ee/cluster/server0/apps/sap.com/crm.b2b/servlet_jsp/b2b/work/jsp_order1200381374441.java:1016: variable num might not have been initialized
			out.print(num);
                                  ^
1 error
].
	at com.sap.engine.services.servlets_jsp.server.jsp.JavaCompiler.compileExternal(JavaCompiler.java:142)
	at com.sap.engine.services.servlets_jsp.server.jsp.JavaCompiler.compile(JavaCompiler.java:238)
	at com.sap.engine.services.servlets_jsp.server.jsp.JSPParser.generateJavaFile(JSPParser.java:369)
	at com.sap.engine.services.servlets_jsp.server.jsp.JSPParser.parse(JSPParser.java:107)
	at com.sap.engine.services.servlets_jsp.server.servlet.JSPServlet.getClassName(JSPServlet.java:238)
	at com.sap.engine.services.servlets_jsp.server.servlet.JSPServlet.compileAndGetClassName(JSPServlet.java:429)
	at com.sap.engine.services.servlets_jsp.server.servlet.JSPServlet.service(JSPServlet.java:169)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
	at com.sap.engine.services.servlets_jsp.server.runtime.RequestDispatcherImpl.doWork(RequestDispatcherImpl.java:321)
	at com.sap.engine.services.servlets_jsp.server.runtime.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:377)
	at org.apache.struts.action.ActionServlet.processActionForward(ActionServlet.java:1758)
	at com.sapmarkets.isa.core.ActionServlet.processActionForward(ActionServlet.java:267)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1595)
	at com.sapmarkets.isa.core.ActionServlet.process(ActionServlet.java:430)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:491)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
	at com.sap.engine.services.servlets_jsp.server.runtime.FilterChainImpl.runServlet(FilterChainImpl.java:117)
	at com.sap.engine.services.servlets_jsp.server.runtime.FilterChainImpl.doFilter(FilterChainImpl.java:62)
	at com.sapmarkets.isa.isacore.TealeafFilter.doFilter(TealeafFilter.java:71)
	at com.sap.engine.services.servlets_jsp.server.runtime.FilterChainImpl.doFilter(FilterChainImpl.java:58)
	at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.runServlet(HttpHandlerImpl.java:384)
	at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.handleRequest(HttpHandlerImpl.java:266)
	at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:387)
	at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:365)
	at com.sap.engine.services.httpserver.server.RequestAnalizer.invokeWebContainer(RequestAnalizer.java:944)
	at com.sap.engine.services.httpserver.server.RequestAnalizer.handle(RequestAnalizer.java:266)
	at com.sap.engine.services.httpserver.server.Client.handle(Client.java:95)
	at com.sap.engine.services.httpserver.server.Processor.request(Processor.java:160)
	at com.sap.engine.core.service630.context.cluster.session.ApplicationSessionMessageListener.process(ApplicationSessionMessageListener.java:33)
	at com.sap.engine.core.cluster.impl6.session.MessageRunner.run(MessageRunner.java:41)
	at com.sap.engine.core.thread.impl3.ActionObject.run(ActionObject.java:37)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sap.engine.core.thread.impl3.SingleThread.execute(SingleThread.java:100)
	at com.sap.engine.core.thread.impl3.SingleThread.run(SingleThread.java:170)

Jag tolkar det som om variablen num inte är deklarerad korrekt, men fattar inte hur jag skall deklarera den!

Tack på förhand!

rollo

spangoMedlem sedan juni 20006 147 inlägg
#8

Ah, my bad. Mitt exempel var visst lite minimalt. När man skriver så här:

double num;
try {
     num = Double.parseDouble(header.getNetValue());
} catch(NumberFormatException e) {
     /* Inte bara siffror i strängen */
}
out.println(num);

... så leder inte alla "paths of execution" till att num initieras. Om parseDouble kastar ett exception, så får num aldrig något värde, och har man inte tilldelat en variabel ett värde får man inte använda variabeln. Det finns i princip två sätt att lösa det på:

// variant 1: ge ett defaultvärde
double num = 0;
try {
     num = Double.parseDouble(header.getNetValue());
} catch(NumberFormatException e) {
     /* Inte bara siffror i strängen */
}
out.println(num);

// variant 2a: kasta vidare exception
double num = 0;
try {
    num = Double.parseDouble(header.getNetValue());
} catch(NumberFormatException e) {
     // kasta vidare ett undantag med bättre felmeddelande och en
     // referens till det ursprungliga undantaget
     throw new ServletException("getNetValue returned invalid double value", e);
}
out.println(num);

Variant två är nog att föredra i ditt fall. Om getNetValue() inte returnerar ett giltigt tal borde det vara ett ganska allvarligt fel (kolla dokumentationen dock, att den returnerar String och inte double är underligt men kan ha något skäl), så det kan gott propageras uppåt. Anledningen till att det funkar att göra på detta vis är att när man kommer till out.println-raden efter try/catchen, så kan kompilatorn se att antingen körs try-blocket hela vägen igenom, i vilket fall num har initierats, eller så avbryts det pga exception, varpå catch-blocket kör. Eftersom catch-blocket alltid kastar vidare ett undantag vet man då att man bara kommer till out.println om hela try-blocket körts, och i sådana fall har num initierats, varför den kan användas.

rolloMedlem sedan aug. 2001203 inlägg
#9

Alternativ 1 funkade perfekt!

Hade du varit här så hade du fått en stor blöt puss!
:birp

spangoMedlem sedan juni 20006 147 inlägg
#10

Var också medveten om att alt. 1 är det fulare av de tu. En dag kommer komma då du sitter och kliar dig i huvudet och undrar varför i hela fridens namn alla kolumner har "0" som värde, eftersom du sväljer undantaget. Logga det i alla fall:

double num = 0;
try {
     num = Double.parseDouble(header.getNetValue());
} catch(NumberFormatException e) {
     log("error parsing getNetValue(); using default value " + num, e);
}
out.println(num);
Genererad på 384 ms · cache AV · v20260730165559-full.f96bc7eb