質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

580閲覧

Caused by: java.lang.NullPointerException: Attempt to・・・のエラーを解決方法を教えてください!

sen10

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/01/27 01:47

編集2019/01/27 04:05

質問

下に載せてあるコードを実行すると、以下のエラーが表示されました。
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
at com.myapplication.MainActivity.<init>(MainActivity.java:25)
載せてあるプログラムの説明を簡単にすると、
1、地図の画像をImageViewを用いて張り付ける。
2、その画像の左上、右下の座標をもとにGPS情報を用いて、自分の現在地が表示されるようにdpと緯度経度の計算式を作る。
3、GPS情報の取得
4、計算式、GPS情報から自分の現在地をマーカーのImageViewを貼り付ける。
というプログラムです。

調べてみると、おそらくnullというコードが関係していると思われるのですが、解決方法がわかりません。
プログラム自体にエラーは出ていないのですが、実行すると実機、エミュレーターともにアプリが落ちてしまいます。
どのようにすればエラーがなくなる可能性があるか、教えていただけないでしょうか。

Java

1import android.support.annotation.NonNull; 2import android.support.v4.content.ContextCompat; 3import android.support.v7.app.AppCompatActivity; 4import android.os.Bundle; 5import android.content.pm.PackageManager; 6import android.location.Location; 7import android.location.LocationListener; 8import android.location.LocationManager; 9import android.location.LocationProvider; 10import android.support.v4.app.ActivityCompat; 11import android.widget.ImageView; 12import android.widget.TextView; 13import android.content.Intent; 14import android.provider.Settings; 15import android.util.Log; 16import android.widget.Toast; 17import android.Manifest; 18 19public class MainActivity extends AppCompatActivity implements LocationListener{ 20 21 private Location location1; 22 23 double Lati =location1.getLatitude(); 24 double Longi =location1.getLongitude(); 25 26 double a=340; 27 double b=33.104001; 28 double c=131.303325; 29 double d=300; 30 double e=0.001823; 31 double f=0.002557; 32 double g= location1.getLatitude(); 33 double h= location1.getLongitude(); 34 double i=b - g; 35 double j=h - c; 36 double k=a * i / e; 37 double l=d * j / f; 38 39 40 LocationManager locationManager; 41 42 @Override 43 protected void onCreate(Bundle savedInstanceState) { 44 super.onCreate(savedInstanceState); 45 setContentView(R.layout.activity_main); 46 47 ImageView imageView =findViewById(R.id.image_view); 48 imageView.setTranslationX((float) k); 49 imageView.setTranslationY((float) l); 50 51 52 if (ContextCompat.checkSelfPermission(this, 53 Manifest.permission.ACCESS_FINE_LOCATION) != 54 PackageManager.PERMISSION_GRANTED) { 55 ActivityCompat.requestPermissions(this, 56 new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 57 1000); 58 } else { 59 locationStart(); 60 61 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 62 1000, 50, this); 63 64 } 65 } 66 67 private void locationStart() { 68 Log.d("debug", "locationStart()"); 69 70 // LocationManager インスタンス生成 71 locationManager = 72 (LocationManager) getSystemService(LOCATION_SERVICE); 73 74 if (locationManager != null && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 75 Log.d("debug", "location manager Enabled"); 76 } else { 77 // GPSを設定するように促す 78 Intent settingsIntent = 79 new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 80 startActivity(settingsIntent); 81 Log.d("debug", "not gpsEnable, startActivity"); 82 } 83 84 if (ContextCompat.checkSelfPermission(this, 85 Manifest.permission.ACCESS_FINE_LOCATION) != 86 PackageManager.PERMISSION_GRANTED) { 87 ActivityCompat.requestPermissions(this, 88 new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000); 89 90 Log.d("debug", "checkSelfPermission false"); 91 return; 92 } 93 94 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 95 1000, 50, this); 96 97 } 98 99 // 結果の受け取り 100 101 /** 102 * Android Quickstart: 103 * https://developers.google.com/sheets/api/quickstart/android 104 * <p> 105 * Respond to requests for permissions at runtime for API 23 and above. 106 * 107 * @param requestCode The request code passed in 108 * requestPermissions(android.app.Activity, String, int, String[]) 109 * @param permissions The requested permissions. Never null. 110 * @param grantResults The grant results for the corresponding permissions 111 * which is either PERMISSION_GRANTED or PERMISSION_DENIED. Never null. 112 */ 113 @Override 114 public void onRequestPermissionsResult( 115 int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 116 if (requestCode == 1000) { 117 // 使用が許可された 118 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 119 Log.d("debug", "checkSelfPermission true"); 120 121 locationStart(); 122 123 } else { 124 // それでも拒否された時の対応 125 Toast toast = Toast.makeText(this, 126 "これ以上なにもできません", Toast.LENGTH_SHORT); 127 toast.show(); 128 } 129 } 130 } 131 132 @Override 133 public void onStatusChanged(String provider, int status, Bundle extras) { 134 switch (status) { 135 case LocationProvider.AVAILABLE: 136 Log.d("debug", "LocationProvider.AVAILABLE"); 137 break; 138 case LocationProvider.OUT_OF_SERVICE: 139 Log.d("debug", "LocationProvider.OUT_OF_SERVICE"); 140 break; 141 case LocationProvider.TEMPORARILY_UNAVAILABLE: 142 Log.d("debug", "LocationProvider.TEMPORARILY_UNAVAILABLE"); 143 break; 144 } 145 } 146 147 @Override 148 public void onLocationChanged(Location location) { 149 150 location1 = location; 151 152 } 153 154 @Override 155 public void onProviderEnabled(String provider) { 156 157 } 158 159 @Override 160 public void onProviderDisabled(String provider) { 161 162 } 163}

activity_main

1<?xml version="1.0" encoding="utf-8"?> 2<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <FrameLayout 10 android:layout_width="fill_parent" 11 android:layout_height="wrap_content" 12 > 13 14 15 <ImageView 16 android:layout_width="340dp" 17 android:layout_height="300dp" 18 android:src="@drawable/tizu4" 19 app:layout_constraintEnd_toEndOf="parent" 20 app:layout_constraintLeft_toLeftOf="parent" 21 app:layout_constraintRight_toRightOf="parent" 22 app:layout_constraintStart_toStartOf="parent" 23 app:layout_constraintTop_toTopOf="parent" /> 24 25 26 <ImageView 27 android:layout_width="15dp" 28 android:layout_height="15dp" 29 android:id="@+id/image_view" 30 android:src="@drawable/azaz" 31 /> 32 33 </FrameLayout> 34</android.support.constraint.ConstraintLayout>

AndroidManifest

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.sousaku1.nakahara.myapplication"> 4 5 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 6 7 <application 8 android:allowBackup="true" 9 android:icon="@mipmap/ic_launcher" 10 android:label="@string/app_name" 11 android:roundIcon="@mipmap/ic_launcher_round" 12 android:supportsRtl="true" 13 android:theme="@style/AppTheme"> 14 <activity android:name=".MainActivity"> 15 <intent-filter> 16 <action android:name="android.intent.action.MAIN" /> 17 18 <category android:name="android.intent.category.LAUNCHER" /> 19 </intent-filter> 20 </activity> 21 </application> 22 23</manifest>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stan_Dma

2019/01/27 02:15

I'm afraid the variable 'location1' has no value set on your code.
m.ts10806

2019/01/27 02:35

タイトルには要件を書いてください。
sen10

2019/01/27 03:21

修正、アドバイスありがとうございます。 次回から要件を書くようにしたいと思います。
sen10

2019/01/27 03:37

Thank you for your answer. I would like to refer to your answer.
m.ts10806

2019/01/27 03:43

質問は編集できるので適宜ご対応いただけたらと
sen10

2019/01/27 03:49

返信ありがとうございます。 質問の編集、できるんですね!参考になりました!
m.ts10806

2019/01/27 03:52

はい。そのためのこの「追記、修正依頼」です。
m.ts10806

2019/01/27 03:55

別件で、質問者さんが良ければそれで良いですが、エラー文のパッケージ名に名前らしきものが含まれた文言が出力されています。これは問題ないですか? もし問題ありでしたら質問削除依頼を運営に直接だしてください(回答がついた質問は質問から削除依頼が出せないのと、編集では編集履歴から確認できるので)
sen10

2019/01/27 04:03

返信ありがとうございます。 本当ですね。あまり問題はないですが、一応編集だけしておきたいと思います。 助かります!
guest

回答2

0

ベストアンサー

java

1 private Location location1; 2 3 double Lati =location1.getLatitude(); 4 double Longi =location1.getLongitude(); 5 6 double a=340; 7 double b=33.104001; 8 double c=131.303325; 9 double d=300; 10 double e=0.001823; 11 double f=0.002557; 12 double g= location1.getLatitude(); 13 double h= location1.getLongitude(); 14 double i=b - g; 15 double j=h - c; 16 double k=a * i / e; 17 double l=d * j / f;

クラスのメンバ変数は、そのクラスのインスタンス生成時に初期化されます。
location1は初期化宣言が無いため、自動的にnullに初期化されます。
この状態でLatiやLongiの初期化をlocation1のメソッドを使って初期化しようとしましたが、
location1はnullなので、NullPointerExceptionで落ちます。
なのでここでそのような初期化は不可能です。

投稿2019/01/27 02:25

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sen10

2019/01/27 03:16

回答ありがとうございます。今、このように書き換えてみたのですが、やはりエラーがでてしまいます。 public class MainActivity extends AppCompatActivity implements LocationListener{ private Location location1; //double Lati = location1.getLatitude(); //double Longi = location1.getLongitude(); double Lati; double Longi; /* double a=360; double b=33.098; double c=131.2063; double d=225; double e=0.0217; double f=0.041; double g=location1.getLatitude(); double h=location1.getLongitude(); double g=location1.getLatitude(); double h=location1.getLongitude(); double i=b - g; double j=h - c; double k=a * i / e; double l=d * j / f;*/ LocationManager locationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000); } else { locationStart(); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 50, this); } double a=360; double b=33.098; double c=131.2063; double d=225; double e=0.0217; double f=0.041; double g=location1.getLatitude(); double h=location1.getLongitude(); double i=b - g; double j=h - c; double k=a * i / e; double l=d * j / f; ImageView imageView =findViewById(R.id.image_view); imageView.setTranslationX((float) k); imageView.setTranslationY((float) l); } エラーの原因は簡単に言うと、計算式のlocation1.getLatitude();に数値が反映されていないことなのでしょうか。どのようにコードをかけばエラーがとれますか?
sen10

2019/01/27 04:38

解決することができました! swordoneさんのアドバイスのおかげでエラーの原因がわかりました! 本当にありがとうございました!!
guest

0

エラーの原因を簡単に言うと、プログラムの流れ的には

java

1 Location location1 = null; 2 double g = location1.getLatitude(); 3 double h = location1.getLongitude();

と同じことになっているということです。location1がnullですから、これを参照すればNullPointerExceptionです。計算式に数値が反映されていないとか、そういった難しい要因は一切存在しません。

Location型の値を得ることができるのは、LocationManager#requestLocationUpdates()によってセットしたリスナーが呼び出されたときでです。

java

1 @Override 2 public void onLocationChanged(Location location) { 3 4 location1 = location; 5 6 double a = 360; 7 double b = 33.098; 8 double c = 131.2063; 9 double d = 225; 10 double e = 0.0217; 11 double f = 0.041; 12 double g = location1.getLatitude(); 13 double h = location1.getLongitude(); 14 double i = b - g; 15 double j = h - c; 16 double k = a * i / e; 17 double l = d * j / f; 18 19 20 ImageView imageView = findViewById(R.id.image_view); 21 imageView.setTranslationX((float) k); 22 imageView.setTranslationY((float) l); 23 }

のように、onLocationChanged()の引数として渡されたLocation型を用いれば解決するのではないでしょうか。

投稿2019/01/27 05:07

keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sen10

2019/01/27 05:19

回答ありがとうございます! 先程、私もその方法で解決することができました。質問を読んでいただき本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問