마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

구글맵에 리스너를 달면 강제종료 됩니다

0 추천
안드로이드 스튜디오에서 4.4.2로 작성중이고

구글맵v2를 이용해 어플을 만들고 있습니다.

정상작동하다가
 mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(Marker marker) {
                InfoGPS.setText(marker.getTitle().toString());
            }
        });

와 같은 리스너코드를 추가 하면 함수 진입 라인에서 널포인트 익셉션이 발생하며 어플이 종료 됩니다.mMap에 다른 리스너(MarkerClick)를 추가해도 같은 오류가 발생합니다
아래는 코드 log캣 입니다, 코드 전문을 올리고 싶은데 전문을 넣으면 너무 길어지네요

12-22 20:33:44.647 8806-8806/com.example.bamboo.googlemapmaker E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                 Process: com.example.bamboo.googlemapmaker, PID: 8806
                                                                                 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bamboo.googlemapmaker/com.example.bamboo.googlemapmaker.MapsActivity}: java.lang.NullPointerException
                                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2205)
                                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2255)
                                                                                     at android.app.ActivityThread.access$800(ActivityThread.java:142)
                                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
                                                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                     at android.os.Looper.loop(Looper.java:136)
                                                                                     at android.app.ActivityThread.main(ActivityThread.java:5118)
                                                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                     at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
                                                                                     at dalvik.system.NativeStart.main(Native Method)
                                                                                  Caused by: java.lang.NullPointerException
                                                                                     at com.example.bamboo.googlemapmaker.MapsActivity.onCreate(MapsActivity.java:55)
                                                                                     at android.app.Activity.performCreate(Activity.java:5275)
                                                                                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
                                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
                                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2255)
                                                                                     at android.app.ActivityThread.access$800(ActivityThread.java:142)
                                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
                                                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                     at android.os.Looper.loop(Looper.java:136)
                                                                                     at android.app.ActivityThread.main(ActivityThread.java:5118)
                                                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                     at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
                                                                                     at dalvik.system.NativeStart.main(Native Method)
12-22 20:33:44.677 8806-8845/com.example.bamboo.googlemapmaker E/DataScheduler: isDataSchedulerEnabled():false
12-22 20:33:46.737 8806-8806/com.example.bamboo.googlemapmaker I/Process: Sending signal. PID: 8806 SIG: 9
신입 (570 포인트) 님이 2015년 12월 22일 질문
코드입니다

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        final EditText Edit1 = (EditText)findViewById(R.id.Edit1);
        final EditText Edit2 = (EditText)findViewById(R.id.Edit2);
        final TextView InfoGPS = (TextView)findViewById(R.id.InfoGPS);
        Button button = (Button)findViewById(R.id.Button);
        

        mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(Marker marker) {
                InfoGPS.setText(marker.getTitle().toString());
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                double Edit1num = parseFloat(Edit1.getText().toString());
                double Edit2num = parseFloat(Edit2.getText().toString());
               MarkerOptions Marker1 = new MarkerOptions().position(new LatLng(Edit1num, Edit2num)).title("Hello!");
                mMap.addMarker(Marker1);
            }
        });

        setUpMapIfNeeded();
    }

    private void setUpMapIfNeeded() {
        if (mMap == null) {
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
            if (mMap != null) {
                setUpMap();
            }
        }
    }

    private void setUpMap() {
        MarkerOptions marker = new MarkerOptions();
        marker.position(new LatLng(37.55, 126.970));
        marker.title("Marker");
        marker.draggable(true);
        marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.minong));
       // mMap.addMarker(marker);

        mMap.addMarker(new MarkerOptions().position(new LatLng(37, 126)).title("Hi!"));
    }

    @Override
    public void onResume() {
        super.onResume();
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        mMap.setMyLocationEnabled(true);
    }

    @Override
    public void onPause() {
        super.onPause();
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        mMap.setMyLocationEnabled(false);
    }

    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }
}

1개의 답변

+1 추천

Caused by: java.lang.NullPointerException at com.example.bamboo.googlemapmaker.MapsActivity.onCreate(MapsActivity.java:55)

라고 되어있으니, MapsActivity.java의 55라인에 뭐가 있는지 보시고, 왜 null인가 원인을 찾으셔야 겠네요.

리스너에 달았다는 게 문제가 아닐 겁니다.

cc1232 (35,280 포인트) 님이 2015년 12월 23일 답변
55라인이 질문글 맨위에 작성한 mMap.setInfoWindowClickListener 함수가 등장하는 라인입니다.
리스너 함수부분을 주석처리 하면 정상작동 되고 함수를 추가하면 딱 함수 시작 라인에서 널포인터 익셉션이 발생해요

왜 널포인터가 발생하는 지 모르겠습니다...
mMap 생성 안하고 사용하셨으니 당연히 nullpointexception 이죠. -_-
코드입니다

코드 전문 댓글로 달아 놨는데 3번째 라인에 mMap 생성 했어요
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

제가 잘못 사용하고 있는건가요?


------수정

  GoogleMap sMap = mapFragment.getMap();
으로 새로 생성한 sMap을 이용하니 작동하네요!

mMap과 새로생성한 sMap의 차이가 뭔가요??
mMap.setOnInfoWindowClickListener 여기 라인 위에 setUpMapIfNeeded()를 사용하면 될듯한데요...

mMap과 새로생성한 sMap의 차이가 뭔가요??
private GoogleMap mMap;
GoogleMap sMap = mapFragment.getMap();
mMap에는 mapFragment.getMap()이게 빠져있죠...

private GoogleMap mMap; 이건 선언만...
선언을 했으면 값을 셋팅해야겠지요...
그게 setUpMapIfNeeded() 여기 함수에 있네요..
...