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

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

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

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

Q&A

解決済

5回答

3864閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

1クリップ

投稿2015/10/24 06:31

編集2015/10/24 09:31

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の吹き出し

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

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

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

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

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

guest

回答5

0

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

投稿2015/10/24 17:41

maiko0318

総合スコア876

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

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

maiko0318

2015/10/24 19:34

テストしたところ、これが原因ではないようですね。
退会済みユーザー

退会済みユーザー

2015/10/25 00:22

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

0

ベストアンサー

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

投稿2015/10/24 09:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

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

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

printStackTraceの使い方が違います.

java

1try{ 2 //処理 3} catch(Exception e){ 4 e.printStackTrace(); 5}

投稿2015/10/24 08:32

編集2015/10/24 09:35
swordone

総合スコア20649

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

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

退会済みユーザー

退会済みユーザー

2015/10/24 08:51 編集

だめです。「e.printStackTrace()」自体を記述すると、そこが赤くなって、文法?存在しない?エラーにecilpsがなります。System.out.println(e.printStackTrace());も中が赤くなって、つかえません。e.printStackTrace()が、void型で使えませんと吹き出しで表示されます。void型なら、戻り値がないので、例外内容も表示されないので、しょうがないですよね。
退会済みユーザー

退会済みユーザー

2015/10/24 08:49

なので、例外の原因は、もういいです。何もかも、普通の簡単なソースなのに、この例外自体が出ること自体が異常なので、回避策でとりあえず、対処します。 だって、 int iii = strModule_info_data1.length(); if (strModule_info_data1 != null) { } は、正常に通過しますが、 if((strModule_info_data1 != null) && (strModule_info_data1.length() == 0)) { } は、同じ例外がでます。
退会済みユーザー

退会済みユーザー

2015/10/24 08:54

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

2015/10/24 09:11

その辺りのスクリーンショット撮れますか?
退会済みユーザー

退会済みユーザー

2015/10/24 09:15

とれませんでした。とろうとして、スクリーンショットのキーを押すと、吹き出しが消えるので。
退会済みユーザー

退会済みユーザー

2015/10/24 09:19

あっ、とれます。携帯で取ればいいですね。
退会済みユーザー

退会済みユーザー

2015/10/24 09:31

写真を追加しました。都合により、ソース全体をお見せすることはできないのですが。
退会済みユーザー

退会済みユーザー

2015/10/25 00:26

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

2015/10/25 00:35

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

退会済みユーザー

2015/10/25 00:35

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

0

java

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

じゃなくて

java

1e.printStackTrace();

でデバッグすべきです。


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


java

1 2 public static void main(String[] args) { 3 try { 4 String strModule_info_data1 = "<山田>"; 5 6 System.out.println("strModule_info_data1=" + strModule_info_data1); 7 System.out.println("きた1=" + strModule_info_data1.substring(0, 1)); 8 9 if (strModule_info_data1.substring(0, 1).equals("<") == true) { 10 System.out.println("きた2"); 11 } 12 } catch (Exception e) { 13 System.out.println("e.getMessage()=" + e.getMessage()); 14 } 15 }

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

java

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

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

投稿2015/10/24 07:31

編集2015/10/24 08:23
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/10/24 07:50 編集

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

2015/10/24 07:54

例外チャッチ節を e.printStackTrace(); にしたらどうなりますか?
退会済みユーザー

退会済みユーザー

2015/10/24 08:45

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

退会済みユーザー

2015/10/24 08:54

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

0

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

実験ソースコード

Java

1 2public class Main { 3 4 public static final void main(String[] args) { 5 String strModule_info_data1 = "<山田>"; 6 7 System.out.println("きた1=" + strModule_info_data1.substring(0, 1)); 8 if (strModule_info_data1.substring(0, 1).equals("/") == true) { 9 System.out.println("きた2"); 10 } 11 if (strModule_info_data1.substring(0, 1).equals("<") == true) { 12 System.out.println("きた3"); 13 } 14 15 } 16} 17

出力結果

きた1=< きた3

投稿2015/10/24 07:04

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/10/24 07:08 編集

きた1=< とコンソースに表示されるので、nullではないはずです。 ご回答ありがとうございます。 ということは、コーディングとしては、間違っていないけど、 何かデータがおかしいか? という問題ですね。 strModule_info_data1.substring(0, 1)をString の別の変数に入れて、equalsを使ってやってみます。 テストまでして頂いてありがとうございます。 お手数をおかけしました。
退会済みユーザー

退会済みユーザー

2015/10/24 07:11

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

退会済みユーザー

2015/10/24 08:55

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問