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

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

ただいまの
回答率

89.98%

JAVAで、substringとequalsの使い方で例外発生

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,175
退会済みユーザー

退会済みユーザー

JAVAで、以下の★の行で、例外が発生します。
原因はなにでしょうか?(例外のメッセージは、nullなので、原因がわかりません)。

try {
        String strModule_info_data1 = "<山田>";

         System.out.println("strModule_info_data1=" + strModule_info_data1);
         System.out.println("きた1=" + strModule_info_data1.substring(0, 1));

    if (strModule_info_data1.substring(0, 1).equals("/") == true) {                       ← ★ここで例外
              System.out.println("きた2");
       }
}
catch (Exception e) {
       System.out.println("e.getMessage()=" + e.getMessage());
       System.out.println("e.getStackTrace()=" + e.getStackTrace());
}

ちなみに、
eclipsのコンソースには、下記が表示されます。

strModule_info_data1=<山田>
きた1=< 
e.getMessage()=null
[Ljava.lang.StackTraceElement;@b45130

きた2は、表示されません。★の行で例外で飛んでしまうので。


------------------------------------------------------------------------
PS.

※上記へ、下記を追加したところ、
String str1moji = strModule_info_data1.substring(0, 1);
if (str1moji.equals("/") == true) {                                    ← ★ここで例外になります
    System.out.println("きた3");
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
e.printStackTrace()を記述したときのeclipsの吹き出し
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

0

私の環境では,とくにnull pointer exceptionなどは見受けられませんでした.
String strModule_info_data1がnullなのではありませんか?

実験ソースコード
public class Main {

    public static final void main(String[] args) {
        String strModule_info_data1 = "<山田>";

        System.out.println("きた1=" + strModule_info_data1.substring(0, 1));
        if (strModule_info_data1.substring(0, 1).equals("/") == true) {
            System.out.println("きた2");
        }
        if (strModule_info_data1.substring(0, 1).equals("<") == true) {
            System.out.println("きた3");
        }

    }
}

出力結果
きた1=<
きた3

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/24 16:08 編集

    きた1=< とコンソースに表示されるので、nullではないはずです。
    ご回答ありがとうございます。
    ということは、コーディングとしては、間違っていないけど、
    何かデータがおかしいか? という問題ですね。

    strModule_info_data1.substring(0, 1)をString の別の変数に入れて、equalsを使ってやってみます。

    テストまでして頂いてありがとうございます。
    お手数をおかけしました。

    キャンセル

  • 2015/10/24 16:11

    編集読みました.
    そうですね.きた1が表示されている以上,nullではないでしょう.(間でデータ操作をしていないなら)
    いいえお力になれずすみません.色々試して解決した際には,自己解決方法を追加してくださいね!

    キャンセル

  • 2015/10/24 17:55

    承知しました。
    お手数をおかけしてもうしわけありませんでした。

    キャンセル

0

System.out.println("e.getMessage()=" + e.getMessage());

じゃなくて

e.printStackTrace();

でデバッグすべきです。


ちなみに、こちらの環境で提示されている現象は発生しません。Nzcさんと同じ結果です。


    public static void main(String[] args) {
        try {
            String strModule_info_data1 = "<山田>";

            System.out.println("strModule_info_data1=" + strModule_info_data1);
            System.out.println("きた1=" + strModule_info_data1.substring(0, 1));

            if (strModule_info_data1.substring(0, 1).equals("<") == true) {
                System.out.println("きた2");
            }
        } catch (Exception e) {
            System.out.println("e.getMessage()=" + e.getMessage());
        }
    }

きた2は、表示されません。★の行で例外で飛んでしまうので。 

if (strModule_info_data1.substring(0, 1).equals("<") == true) {

でないと、System.out.println("きた2"); になるわけないのに、何がわからないというのでしょう?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/24 16:38 編集

    System.out.println(e.getStackTrace()); にしたところ、下記の例外メッセージが表示されました。意味が分かりませんが、調査します。
    [Ljava.lang.StackTraceElement;@b45130"

    キャンセル

  • 2015/10/24 16:54

    例外チャッチ節を
    e.printStackTrace();
    にしたらどうなりますか?

    キャンセル

  • 2015/10/24 17:45

    だめです。「e.printStackTrace()」自体を記述すると、そこが赤くなって、文法?存在しない?エラーにecilpsがなります。System.out.println(e.printStackTrace());も中が赤くなって、つかえません。e.printStackTrace()が、void型で使えませんと吹き出しで表示されます。

    キャンセル

  • 2015/10/24 17:54

    System.out.println(e.printStackTrace());
    こう記述すると、eclipsで上記が赤くなり、System.out.printlnは、引数void型には適用できません。と吹き出しが出ます。

    キャンセル

0

例外で重要なのはメッセージではなく,その例外のクラスが何なのか,そしてスタックトレースがどこをたどっているのかということです.あなたの情報にはそれが一切入っていません.
Trowable#getStackTrace()で返ってくるのはStackTraceElementの配列なので,それをそのまま文字列連結しても意味がありません.
[Ljava.lang.StackTraceElement;@b45130 ←これはその配列の型とハッシュコードを意味しているだけです.

例外の原因を探りたいなら,e.printStackTrace()してください.

printStackTraceの使い方が違います.
try{
    //処理
} catch(Exception e){
    e.printStackTrace();
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/25 09:26

    申し訳ありません。プロフィールに書いてあるように初心者なので、「あなたの情報にはそれが一切入っていません.
    Trowable#getStackTrace()で返ってくるのはStackTraceElementの配列なので,それをそのまま文字列連結しても意味がありません.」の意味が全くわかないので、後日、ネットで調べて理解します。尚、プロフィールにかいてあるように、初心者の私にも理解できる回答をしてくれるようお願いしておりますので、それがお手間でしたら、ご回答不要です。余計混乱していまい、その文章理解にあちこちのネット検索をしたりして、時間がかかり、困ってしまうので(しかし、意味不明な状態は嫌いなので、結局、質問を閉じて、落ち着いたときに再度、調査はします)。

    キャンセル

  • 2015/10/25 09:35

    初心者であるというのは理解しました.ただそれを差し置いてもなぜあなたはそんなにも「上から目線」なのですか?非常に腹立たしいです.

    キャンセル

  • 2015/10/25 09:35

    } catch(Exception e){
    e.printStackTrace();
    }
    残念ながら、今日は、例外がでずに、正常に動きます。
    ということで、迷宮入りになりました。
    お手数をお掛けしました。

    キャンセル

0

2バイト文字と1バイト文字を比較していますね。
if (strModule_info_data1.substring(0, 1).equals("/") == true) {
ではなく、
if (strModule_info_data1.substring(0, 1).equals("/") == true) {
でテストしてみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/25 04:34

    テストしたところ、これが原因ではないようですね。

    キャンセル

  • 2015/10/25 09:22

    テストしましたが、同じ例外になります。

    キャンセル

check解決した方法

-18

異常動作の例外部分を、回避策として、JAVAの文字列操作クラスに入れ、関数化したところ、正常に、動作した。
あの根本の原因は、技術者なので、あとで、じっくり突き止める。それが、技術者!!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる