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

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

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

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

Android Studio

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

Q&A

2回答

8008閲覧

if文の中の変数に値を入れたい

ok1213

総合スコア6

Java

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

Android Studio

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

0グッド

0クリップ

投稿2017/09/20 04:20

編集2022/01/12 10:55

###前提・実現したいこと
NFC機能を用いてカード情報と他のクラスから入力したデータをPHPに送りたいのですが
入力したデータをPHPで出力するとnullが返ってきてしまいます。
etMessageの中にtagIdの値とdataの値を格納したいです。
宜しくお願いします。

###発生している問題・エラーメッセージ
if文内のdataの値がnullになってしまう。

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

package com.ts_example.crest.myapplication; import android.app.Activity; import android.content.Intent; import android.icu.text.IDNA; import android.nfc.NfcAdapter; import android.os.Build; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class NextActivity extends Activity { String etAddress; int etPort; String etMessage; String data; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.next); TextView text = (TextView) findViewById(R.id.tag_id); // インテントの取得 Intent intent = getIntent(); //intentに保存されたデータを取り出す data = intent.getStringExtra("type"); // ICカードの検出かチェック String action = intent.getAction(); if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { // NFCからID情報取得 byte[] ids = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); StringBuilder tagId = new StringBuilder("ID(" + ids.length + "bytes) : "); for (int i = 0; i < ids.length; i++) { tagId.append(String.format("%02x", ids[i] & 0xff)); } //String type = ",syukkin"; etMessage = (tagId.toString() + data); etAddress = "192.168.0.72"; etPort = 3333; ClientAsyncTask sc = new ClientAsyncTask(etAddress, etPort, etMessage); sc.execute(); } } }

###試したこと
if文の外で出力するとdataの中身は取得できるがtagIdがnullになってしまいます。
現在のソースではtagIdの値は受け取れているがdataの値がnullになってしまう。

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

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

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

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

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

LouiS0616

2017/09/20 04:24

インデントが崩れて読みづらいです。質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
ok1213

2017/09/20 04:31

すいませんでした。修正しました。
momon-ga

2017/09/20 05:57

追記をお願いします。if文の中でnullになっているというのは、どうやって確認しましたか? nullになっている変数名は具体的になんですか?
ok1213

2017/09/20 06:12 編集

androidから送られてきたデータをPHPに出力したところnullがdataがnullになっていました。
ok1213

2017/09/20 06:09

変数名はdataです。他のクラスからIntentで値を持ってきてdataに格納してあります。
momon-ga

2017/09/20 06:12

「 if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {」をコメントアウトするとnullでない値が、PHP側で受け取れるという認識であってます?
ok1213

2017/09/20 06:21

その認識であっています。
ok1213

2017/09/20 06:24

text.setText(data);をif文内と外で書いたときif文内のときは何も表示されないのですが、if文の外だとdataの中身が表示されるのは確認できました。
momon-ga

2017/09/20 06:29

actionの値が想定と違っていて、そもそもif文内通ってないとかいうことはないですか?
ok1213

2017/09/20 06:35

if文は通っていると思います。if文の中のNFC機能でカード情報をtagIdに格納できているので。
guest

回答2

0

変数とスコープについて ですね。
if文に限らず 破線かっこ{ }で区切られた空間をスコープと言います。
スコープ内で宣言した変数はスコープ外からは参照できません。

java

1if(...) { 2 StringBuilder tagId = new StringBuilder("ID(" + ids.length + "bytes) : "); 3 //ここでtagId は参照できる。スコープ内 4} 5//ここでtagId は参照できない。スコープ外

スコープ外で宣言すれば参照できます。

java

1StringBuilder tagId = new StringBuilder("ID(" + ids.length + "bytes) : "); 2if(...) { 3 //ここでtagId は参照できる。スコープの内部のスコープでは参照できる。 4} 5 6//ここでもtagId は参照できる。

ではこのtagId が宣言されたスコープ { }
はどこになるかというと、そのメソッド定義の
public void onCreate(Bundle savedInstanceState) {

}

このスコープになります。

投稿2017/09/20 04:44

Tak1016

総合スコア1408

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

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

ok1213

2017/09/20 04:52

ありがとうございます。 スコープ内の変数しか参照できないということですね。 ただ、dataの値がpublic void onCreate(Bundle savedInstanceState){}の中では受け取れているのに if文の中ではnullになってしまうのはどうしてかわかりますか?
Tak1016

2017/09/20 04:59

ifの中でデータが消えるなんていうのは通常ありえません。 ブレークポイントをifの外側に張って、data変数を監視しながらifの中にステップ実行してみてください。 本当にifに入ったタイミングでnullになりますか?
ok1213

2017/09/20 05:30

デバッグのやり方が調べたのですがわからず確認はできていないのですが etMessage = (tagId.toString() + data);をif文の外, public void onCreate(Bundle savedInstanceState){}の中に書いたときにはdataにきちんと中身が格納されています。
Tak1016

2017/09/20 06:40

デバッグ実行ステップ実行を知らずに開発なんで効率悪すぎなので、覚えましょう。
ok1213

2017/09/20 08:13

URLありがとうございます。 調べてデバッグできるようにしたいと思います。
ok1213

2017/09/21 07:35

デバッグを行ってみたのですがUSBを繋いだ状態だとNFC機能が使えないため原因を突き止める事ができません。 ただ、NFC機能を除いてデバッグした結果if文の中でもきちんとdataの値を受け取る事が出来てました。
Tak1016

2017/09/21 08:25

ですよね。ブロックの内側に入ったからといって変数がnullになるはずがないんですよ。他の要因でしょうね。
guest

0

スコープの話も関係していますが、すでに指摘されているようにスコープの問題が要因ではないと思われます。

AndroidManifest.xml ファイルの指定にもよりますが、Activity.onCreate() が呼ばれるのは
NFCタグを読んだ時、アプリが起動した時、と複数のケースが発生します。

そんな場合にifの内、外でdataが取れる状況が変わりえます。
例えば、アプリを起動しただけではonCreateが呼ばれるものの、NFCタグは読んでいないので
NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)には引っかかりません。

デバッガーの使い方もそうですが、デバッガーが使えない状況でもデバッグできるよう、
画面にTextViewを張り付けてメッセージを表示するなどして、確実に確認できるように
するのが先決かと思われます。

それと、Activityのライフサイクル(onCreate~onResume~...)の意識も重要となります。
onCreate()は普通は1回だけ呼ばれますが、今回のケースでは何回か呼ばれていると思います。
(Androidの問題ではありません)

投稿2017/09/24 14:17

dodox86

総合スコア9183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問