2013-03-31 9 views
1

어떤 이유로이 코드는 ClassCastException을 던져서 Double을 Float으로 캐스팅 할 수 없다고 알려줍니다. 예외는 아래 코드의 첫 번째 줄에서 발생합니다. mapData.speedsArrayList<Float>입니다. 더블은 어디 있습니까? 내가 어떤 오류가 발생했습니다,하지만 여전히 발생하는 이유를 알고하지 않습니다 발견 생각ClassCastException Double to Float

03-31 01:00:51.008: E/AndroidRuntime(17778): FATAL EXCEPTION: main 
03-31 01:00:51.008: E/AndroidRuntime(17778): java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Float 
03-31 01:00:51.008: E/AndroidRuntime(17778): at net.taptools.android.trailtracker.ResultsMapViewingFragment$4.onMapLongClick(ResultsMapViewingFragment.java:224) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at com.google.android.gms.maps.GoogleMap$5.onMapLongClick(Unknown Source) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at com.google.android.gms.internal.k$a.onTransact(Unknown Source) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at android.os.Binder.transact(Binder.java:326) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at com.google.android.gms.maps.internal.IOnMapLongClickListener$Stub$Proxy.onMapLongClick(IOnMapLongClickListener.java:93) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at maps.i.s.a(Unknown Source) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at maps.y.v.d(Unknown Source) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at maps.y.bf.onLongPress(Unknown Source) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at maps.d.v.onLongPress(Unknown Source) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at maps.d.h.c(Unknown Source) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at maps.d.h.c(Unknown Source) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at maps.d.j.handleMessage(Unknown Source) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at android.os.Looper.loop(Looper.java:137) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at android.app.ActivityThread.main(ActivityThread.java:5059) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at java.lang.reflect.Method.invokeNative(Native Method) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at java.lang.reflect.Method.invoke(Method.java:511) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 
03-31 01:00:51.008: E/AndroidRuntime(17778): at dalvik.system.NativeStart.main(Native Method) 

--edit--

: 여기

float spd = mapData.speeds.get(focusPointIndex); 
spd = (spd * 3600/1609.34); 

는 전체 스택 추적입니다 , 또는 그것을 고치는 방법. JSON에서 mapData 객체를 파싱하고 다양한 유형의 ArrayLists가 많이 포함되어 있으므로 지정된 유형의 JSONArray 및 ArrayList를 구문 분석 할 메소드를 만들었습니다. 여기 방법이 있습니다.

private <T> ArrayList<T> JSONArrayToList(JSONArray jsonArr){ 
     ArrayList<T> arrList = new ArrayList<T>(); 
     for(int i = 0; i<jsonArr.length(); i++){ 
      try { 
       arrList.add((T)jsonArr.get(i)); 
      } catch (JSONException e){e.printStackTrace();} 
     } 
     return arrList; 
    } 
+1

'spd'는'float' 또는'Float'로 선언 되었습니까? 그리고 오류가 두 번째 줄에서 나오지 않았 음을 절대적으로 확신합니까? –

+0

오류 메시지에 대한 비표준 설정이 있습니까? 컴파일 할 Java 버전은 무엇입니까? –

+0

플로트 또는 래퍼 클래스의 경우 Java가 자동으로 unbox됩니다. – mrres1

답변

3

난 당신의 코드가 실제로 spdFloat (오히려 float (A)보다를)로 선언 같은데요. 또한 예외가 두 번째 줄에서 오는 것 같아요. 에 두 번째 줄을 변경 시도하십시오 double보다는 오른쪽 float를 만들 것입니다

spd = (spd * 3600/1609.34f); 

합니다. Java의 부동 소수점 리터럴은 f 또는 F으로 끝나지 않는 한 double입니다.

내 추측이 정확하면 예외가 변수 spd에 할당하기 위해 Float에 캐스팅하려고 다음 Doubledouble -valued 표현을 오토 박싱 및 Java에 의해 발생되고있다.

잠시 재생 한 후에 오류 메시지가 중복 될 수없는 것으로 나타났습니다. 코드가 컴파일되지 않습니다. 컴파일러는 두 번째 줄에서 "오류 : 가능한 정밀도 손실"이라고 불평합니다. 이제는 또 다른 추측을했습니다. 오류 메시지를 표시하지 않았거나 오류 대신 경고로 설정하고 무시하는 것입니다.

+0

나는 그 * 오류 메시지 ("정확성 상실")를 억제 할 수 있다고 생각지 않는다. JLS에서는 타입 변환없이'double '을'float'에 할당하는 것은 불법 코드이며, 그렇게하도록 허용 한 컴파일러는 호환되지 않을 것이라고합니다. –

+0

spd는 정말 원시적이었습니다. 나는 'f'를 추가하려했지만 아무 소용이 없었다. 같은 오류가 발생했습니다. 나는 오류를 억제하거나 경고로 오류를 설정하는 방법을 모르므로 내가 그랬는지 의심 스럽다. – brainmurphy1

+0

@ brainmurphy1 - 내 대답보기 :-) –

1

mapData.speeds이 실제로 ArrayList<Float>으로 선언 된 경우 안전하지 않은 변환에 대한 경고를 표시하거나 무시한 경우 클래스 캐스팅 예외를 얻을 수있는 유일한 방법입니다.

Float tmp = (Float) (mapData.speeds.get(focusPointIndex)); 
float spd = tmp.floatValue(); 

과 실제 : 코드이 실제로 해당하기 때문에 (. 어느 speed 속성 또는 목록에 값을두고 코드를 설정하는 코드에서)

클래스 캐스트는 일이 될 것입니다 mapData.speeds.get의 (삭제 된) 서명은 Object get(int)입니다.

일반적으로 (즉, 당신이 경고를 표시하지 않는 경우) Double에서 결과가 ArrayList<Float>에 추가되는 것입니다 뭔가를 할 경우 컴파일러는 당신을 말할 것이다. 그러나 이러한 경고를 무시하면 Double으로 끝나고 ArrayList<Float>이됩니다. 이 경우 get의 결과를 float으로 사용하면 클래스 캐스팅 예외가 발생합니다.

+0

내가 아는 한 모든 경고를 무시하지 않았으므로 내 문제가 솔루션의 기준을 충족한다고 생각하지 않습니다. – brainmurphy1

+0

확인. 그래서 이것을 시도하십시오. 'Object spd = mapData.speeds.get (focusPointIndex); System.out.println (spd.getClass());''java.lang.Double'을 출력 할 것입니다. –

+0

예! 그것은. 어떻게 그렇게 될수 있니? "public ArrayList 속도;"로 선언되었습니다. MapData 클래스에 있습니다. – brainmurphy1

0

변경 3600/1609.34 당신이 이중 형식으로 유추됩니다 코드의 진수를 사용하는 경우

3600f/1609.34f합니다. 숫자 끝에 F를 포함하면 컴파일러에게 double이 아닌 float가됩니다.

D 또는 F (Double 또는 Float)를 사용하여 십진수 상수를 항상 끝내는 습관을 만드십시오. Java가 간단한 흐름을 작성하기 위해 머리를 쓰게되는 것을 고려하면 과도하게 생각해서는 안됩니다.

+0

f를 추가했습니다. 아무것도 바뀌지 않았다. 그래도 고마워 – brainmurphy1