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

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

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

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

Android

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

Android Studio

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

Q&A

3回答

3680閲覧

[AndroidStudio]アプリ作成 データ保存の仕方について

azuki603

総合スコア7

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2017/11/04 13:40

編集2017/11/04 14:09

###前提・実現したいこと
つい先日、AndroidStudioでアプリ作成を始めたのですが、データの保存で行き詰っています。
色々なサイトを見て、自分なりにローカルファイルでのデータ保存を試してみたのですが、全く上手くいきません。
一体どうしたら良いでしょうか。
エラーメッセージは、実機に表示されるもので、AndroidStudioの方にエラーの表示はありません。

###発生している問題・エラーメッセージ

問題が発生しました。The Clickerを終了します。

###該当のソースコード

public class MainActivity extends Activity { String st_val = readFile("data.txt"); int value = Integer.parseInt(st_val); FileOutputStream outputStream; protected void onCreate(Bundle savedInstanceState) { //アプリの実行部分 super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageButton mony = (ImageButton) findViewById(R.id.monybag); //monybagの定義 mony.setOnClickListener(new View.OnClickListener() { //クリックと数字の増加の処理部分 @Override public void onClick(View view) { TextView num = (TextView) findViewById(R.id.number); value = value + 1; num.setText(String.valueOf(value)); writeFile(value); } }); //増加処理ここまで } public void writeFile(int i) { //保存処理(仮) try { String string = String.valueOf(i); outputStream = openFileOutput("data.txt",Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } //保存処理ここまで public String readFile(String file) { //読み込み処理(仮) FileInputStream fileInputStream; String text = null; try { fileInputStream = openFileInput(file); String lineBuffer = null; BufferedReader reader= new BufferedReader(new InputStreamReader(fileInputStream,"UTF-8")); while( (lineBuffer = reader.readLine()) != null ) { text = lineBuffer ; } } catch (IOException e) { e.printStackTrace(); } if(text == "") { return "0"; }else{ return text; } } //読み込み処理ここまで }

###試したこと
SharedPreferencesの方も試してはみたのですが、そちらも上手くいきません。(今後の事も考えてローカルファイルで保存したいです)
おおよそ原因だと思われる部分は何度が修正やコードの追加をしてみたりしたのですが(例:readFileのreturnにif文を使って、初回の値を0で返すようにした)それも間違っているのか、別の場所が駄目なのか、全く分からなくなってしまったので、質問させていただきました。

###Logcat(追記)
Logcatというものがあったのですね。初めて知りました。
これで良いでしょうか?

11-04 23:06:06.633 26282-26282/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.clicker.akito.theclicker, PID: 26282 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.clicker.akito.theclicker/com.clicker.akito.theclicker.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileInputStream android.content.Context.openFileInput(java.lang.String)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2236) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) 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:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileInputStream android.content.Context.openFileInput(java.lang.String)' on a null object reference at android.content.ContextWrapper.openFileInput(ContextWrapper.java:176) at com.clicker.akito.theclicker.MainActivity.readFile(MainActivity.java:67) at com.clicker.akito.theclicker.MainActivity.<init>(MainActivity.java:23) at java.lang.reflect.Constructor.newInstance(Native Method) at java.lang.Class.newInstance(Class.java:1606) at android.app.Instrumentation.newActivity(Instrumentation.java:1066) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  at android.app.ActivityThread.access$800(ActivityThread.java:151)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5254)  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:903)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  11-04 23:06:06.637 26282-26282/? I/Process: Sending signal. PID: 26282 SIG: 9

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

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

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

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

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

swordone

2017/11/04 13:48

デバッグモードで動作させているでしょうか?もしそうならLogcatにエラーのログが出るので、それを掲載してください。
guest

回答3

0

結論から言うと、Activityのメンバ宣言でString st_val = readFile("data.txt");としていることが原因です。
###ログの読み方
この行以降に注目してください。

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileInputStream android.content.Context.openFileInput(java.lang.String)' on a null object reference

まずNullPointerExceptionはご存知でしょうか。nullの変数に対してメソッドを起動するなどの操作を行おうとした場合に発生する例外です。
続きを読むと、FileInputStreamを返すContextクラスのメソッドopenFileInputをnullに対して起動しようとしたようです。さらに下数行を読むと

at android.content.ContextWrapper.openFileInput(ContextWrapper.java:176) at com.clicker.akito.theclicker.MainActivity.readFile(MainActivity.java:67) at com.clicker.akito.theclicker.MainActivity.<init>(MainActivity.java:23)

この最初の行は例外が発生したまさにその場所になります。その次を読むとreadFileというメソッド内、クラスの67行目で呼んだようです。tryブロックの最初にありますね。
これを呼び出したのがどこかというと、MainActivity.<init>となっています。<init>は初期化処理を意味し、主にメンバ変数の宣言段階で初期化式が書かれている場合のその初期化処理を指します。
ここでContextを必要とするメソッドを呼んでいることになります。
しかし、この初期化段階ではまだActivityのContextは準備ができていないため、Context絡みのメソッドは呼び出せません。

解決策としては、この初期化処理をonCreateメソッド内に書いてください。

投稿2017/11/04 14:41

swordone

総合スコア20651

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

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

0

直接のエラー原因については他の方がすでに記しているので、私は触れません。

「ローカルファイルで保存したい」ということなのですが、ここで言っている「ローカル」とはどういった意味で考えているのでしょうか?

openFileOutputやopenFileInputを用いるのはもちろん有効なのですが、これらのメソッドによるアクセスは/data/data/<パッケージ名>/files/というディレクトリーの下に固定されます。ここはファイルマネージャーアプリなどで自由に閲覧できる場所ではありません(非root化ならば)。それが想定外ならば、設計方針を転換する必要があります。

念のためのおせっかいです。無用であったらすみません。

投稿2017/11/04 14:42

編集2017/11/04 14:43
keicha_hrs

総合スコア6768

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

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

abs123

2017/11/04 23:50

デバッグ用にファイルを見たいだけなら、(デバッグAPKでインストールされている限り) "adb shell"から"run-as パッケージ名"で見ることができます。こちらも参考程度に。
guest

0

フィールド変数st_valをreadFileメソッドで初期化していますが、このメソッドの中で使用されているContext#openFileOutputはActivityが一定のライフサイクルを経ないと使用できません。

フィールド変数の初期化をonCreateメソッド内で行ってください。

投稿2017/11/04 14:28

yona

総合スコア18155

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問