누군가가 도움을 줄 수 있으면 기쁩니다.문자열을 Float으로 구문 분석 - Android
Google Weather API를 사용하여 특정 위치의 날씨를 얻고 있습니다. 온도가 반환되면 섭씨로 변환하려는 Kevin 형식으로 반환됩니다.
불행히도 내 코드에서 오류가 발생합니다. 원인 : java.lang.NumberFormatException : 유효하지 않음 float : "temperature"
문자열을 Float 또는 Double로 구문 분석하여 섭씨로 변환 할 수 있어야합니다. 분명히 문자열을 숫자가 아닌 텍스트로 섭씨로 변환 할 수는 없습니다.
Kevin에서 Celsius로 변환하려고 할 때 어떤 일이 일어나고 있는지. 누군가 내가 뭘 잘못하고 있는지 찾아 낼 수 있습니까?
public void open(View view){
String url = location.getText().toString();
String finalUrl = url1 + url;
country.setText(finalUrl);
obj = new HandleJSON(finalUrl);
obj.fetchJSON();
float celsius = 273.15f;
String temp = obj.getTemperature().toString();
Float finalTemp = Float.parseFloat(temp) - celsius;
while(obj.parsingComplete);
country.setText(obj.getCountry());
temperature.setText(finalTemp.toString());
humidity.setText(obj.getHumidity());
pressure.setText(obj.getPressure());
}
오류 로그 ***
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:4007)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java:4002)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.NumberFormatException: Invalid float: "temperature"
at java.lang.StringToReal.invalidReal(StringToReal.java:63)
at java.lang.StringToReal.initialParse(StringToReal.java:114)
at java.lang.StringToReal.parseFloat(StringToReal.java:323)
at java.lang.Float.parseFloat(Float.java:306)
at com.testing.listco.testrecycler.MainActivity.open(MainActivity.java:47)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java:4002)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
HandleJSON **에 의한
public class HandleJSON {
private String country = "country";
private String temperature = "temperature";
private String humidity = "humidity";
private String pressure = "pressure";
private String urlString = null;
public volatile boolean parsingComplete = true;
public HandleJSON(String url){
this.urlString = url;
}
public String getCountry(){
return country;
}
public String getTemperature(){
return temperature;
};
public String getHumidity(){
return humidity;
}
public String getPressure(){
return pressure;
}
@SuppressLint("NewApi")
public void readAndrParseJSON(String in){
try {
JSONObject reader = new JSONObject(in);
JSONObject sys = reader.getJSONObject("sys");
country = sys.getString("country");
JSONObject main = reader.getJSONObject("main");
temperature = main.getString("temp");
pressure = main.getString("pressure");
humidity = main.getString("humidity");
parsingComplete = false;
}
catch(Exception e){
//TODO: Auto-generated catch block
e.printStackTrace();
}
}
public void fetchJSON(){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
//Starts the query
InputStream stream = conn.getInputStream();
String data = convertStreatToString(stream);
readAndrParseJSON(data);
readAndrParseJSON(data);
stream.close();
}
catch(Exception e){
e.printStackTrace();
}
}
});
thread.start();
}
static String convertStreatToString(java.io.InputStream is){
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
}
문자열 temp = obj.getTemperature(). toString(); 'temp = "temperature"가 끝나기 때문에 당신이 기대하는 것을하지 않습니다. 이것은 유효한 float가 아닌 것입니다. getTemperature()가 실제 온도 대신 "온도"를 반환하고있는 것 같습니다. – zgc7009
죄송합니다. 더 설명해야합니다. 오류가 발생한 위치를 알고 있습니다. 내가 Celcius로 변환 할 수 있도록 플로트 또는 더블로 온도를 파싱하는 것입니다. –
그리고 @ zgc7009가 왜 실패했는지 정확하게 알려 줬습니다. – Simon