2015-01-08 4 views
-4

누군가가 도움을 줄 수 있으면 기쁩니다.문자열을 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() : ""; 
    } 

} 
+4

문자열 temp = obj.getTemperature(). toString(); 'temp = "temperature"가 끝나기 때문에 당신이 기대하는 것을하지 않습니다. 이것은 유효한 float가 아닌 것입니다. getTemperature()가 실제 온도 대신 "온도"를 반환하고있는 것 같습니다. – zgc7009

+0

죄송합니다. 더 설명해야합니다. 오류가 발생한 위치를 알고 있습니다. 내가 Celcius로 변환 할 수 있도록 플로트 또는 더블로 온도를 파싱하는 것입니다. –

+3

그리고 @ zgc7009가 왜 실패했는지 정확하게 알려 줬습니다. – Simon

답변

2

이 범인입니다 :

String temp = obj.getTemperature().toString(); 

이 문자열 temp에 문자열 "온도"를 할당하고, 당신이에 플로트 "온도"를 변환하려고 정수. 이것은 "온도"문자열이 - 분명히 - 부동이 아니기 때문에 가능하지 않습니다.

+0

죄송합니다. 더 설명해야합니다. 오류가 발생한 위치를 알고 있습니다. 내가해야 할 일은 플로트 나 더블로 온도를 파싱해서 섭씨로 바꿀 수있게하는 것입니다. –

+0

@Matt 먼저 온도를 확인해야합니다. 그런 다음에 만 부동 또는 이중 또는 다른 것으로 구문 분석 할 수 있습니다. –

1

: java.lang.NumberFormatException의 : 잘못된 플로트 : "온도"

"온도 "유효한 플로트가 아니므로 예외가 throw됩니다. 유효한 플로트, 4.5 것 등

+0

죄송합니다. 더 설명해야합니다. 오류가 발생한 위치를 알고 있습니다. 내가해야 할 일은 플로트 나 더블로 온도를 파싱해서 섭씨로 바꿀 수있게하는 것입니다. –