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

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

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

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

Q&A

解決済

2回答

3457閲覧

スタックトレースの読み方

YukoYasutake

総合スコア12

Java

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

1グッド

0クリップ

投稿2016/08/10 02:58

昨日javaを扱ったのですが、
スタックトレースの表している事がよく分かりません。
試しに

Main.java public class Main { public static void main(String[] args){ int a = new java.util.Scanner(System.in).nextInt(); System.out.println(a); } }

というコードを打ってみたのですが

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at Main.main(Main.java:3)

という赤文字が現れます。
一行目で何かの要素に例外が生じたのは分かりましたが残りの意味が分かりません
どういう意味なのでしょうか

Mr_Roboto👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

大雑把に言うと、メソッドを呼ぶごとにスタックに情報が積まれていきます。
スタックトレースは、その積まれたスタックをさかのぼってエラーが出ている箇所を特定するための情報を提供します。

ご質問の例では、Main.javaの3行目で使っているScanner.nextIntメソッドの呼び出しがあって、そこからさらにScanner.nextIntメソッド(オーバーロードメソッド)が呼ばれ、Scanner.nextメソッドが呼ばれ、Scanner.throwForが呼ばれ、Scanner.throwForが例外をスローしているのでそこが終点になります。

スタックトレースについてはここでは書ききれないので、下記の記事などを参考に学んでみて下さい。

スタックトレース (stack trace)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
http://wa3.i-3-i.info/word13281.html

スタックトレースを利用してメソッドの情報を取得する:CodeZine(コードジン)
https://codezine.jp/article/detail/124

投稿2016/08/10 03:07

argius

総合スコア9388

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

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

YukoYasutake

2016/08/10 03:23

Scanner.Throwfor というのはこのコードだとどこに当たるのでしょうか?
argius

2016/08/10 03:27

Scanner.Throwforはこのコードからは直接は参照していません。 Scanner.nextIntを処理する際に、整数以外が入力されたなどでエラーと判断され、Scanner.nextInt(正確にはScanner.next)がエラー処理のためにScanner.Throwforを呼んでいます。
YukoYasutake

2016/08/10 03:52

入力する前に出たので、 3行目のどこかに不備があったということでいいのでしょうか
argius

2016/08/10 04:00

このエラーは、ご提示いただいたコードを普通に実行した場合は出ない(入力待ちになる)はずですので、何か特殊な方法で実行されている可能性があります。 JavaやOSのバージョンと、どうやって実行しているかを、分かる範囲で教えていただけますか?
YukoYasutake

2016/08/10 04:48

Dokojavaというサイトで組んでいます Win10のせいなのかふつうにjavaを起動すると一瞬で落ちるので
argius

2016/08/10 04:55

DokojavaのようなWeb上でJavaを実行できるサービスでは、標準入力(System.in)は無効になっている可能性があります。そのため、NoSuchElementExceptionが発生しています。 Windows10でもJavaは普通に使えます。 もしかして、32bitと64bitを間違えてインストールしていませんか?
YukoYasutake

2016/08/10 06:15

32bit版をインストールしたのですが、もしかして64bit版なのでしょうか もしくはウィンドウズオフライン版では駄目なのでしょうか
argius

2016/08/10 06:23

Windows10は32bitと64bitのどちらでしょうか。 それと同じなら問題ないはずです。
abs123

2016/08/10 06:45

普通にJavaを起動する・・・・・ 出来れば、起動までの実行手順を教えてください
asahina_dev

2016/08/10 06:48

ideone.com でもあるね そしてなんじゃこれ [ http://dokojava.jp/pc/index.html ] 「サンプル⇢キーボード入力の確認」ででてくるな・・使えないサンプルをだすなよぉw
argius

2016/08/10 06:52

Matobaaさん 最初上手く行かないと思いましたが、あらかじめ標準入力を入れておけば良いんですね! でもこれだと対話的にはできない? asahina_devさん それはひどい... paizaかideoneを使うのが吉ですね。 でもローカルでも動かせるようにしておくのも後々のためかな、と思います。
argius

2016/08/10 07:02

Matobaaさん これは良いですね! オンラインIDEぽい感じ。 ただ、初心者さんには少し難易度が高そうですね。
YukoYasutake

2016/08/10 07:35

とりあえず全部試してみようと思います ありがとうございました
guest

0

スタックトレースは問題が起きた時から遡って、どのようにプログラムが呼び出されてきたかを示したものです。

スタックトレースを読み解く際、自分が作ったプログラムの中で呼び出しが行われていく間は(自分が書いたコードですから)何が起きたのかが判るのですが、javaのライブラリが呼び出された後の流れを追跡する事は困難もしくは不可能です。
そうした中で、質問のケースは、例外の種類が有益な情報になると思います。

問題を起こしたのは、下記の部分です。

int a = new java.util.Scanner(System.in).nextInt();

プログラムの意味は、「キーボード入力(System.in)された内容を調べて(Scan)、整数を表している部分(文字列)を整数として取り出し、変数aに格納する」です。

そして、発生したのは NoSuchElementException (「そのような要素(データ)は有りません」例外)でした。
Javaプログラムがキーボード入力から整数を表している部分(文字列)を探そうとしている時に「そのようなデータは有りません」という状況になったという事は、キーボードからの入力が途絶えたのだと推測できます。

ここで、元のプログラムに戻りましょう。

プログラムは、キーボード入力から整数を取得する部分から始まっています。
コマンドプロンプトからこのプログラムが起動されたとすれば、画面上は何が起きているのか判らない(特に何も表示されていない)状態なります。
<推測>
プログラムはキーボードから数字が入力される事を期待して書かれていますが、操作している人はそれが判らないので control+Z とか control+Dのような入力を終了するようなキー操作をしてしまった。
キーボード入力が終了されたために、入力から整数を探すデータを取得できる可能性が無くなったので、それを「そのような要素(データ)は有りません」例外で知らせた。

これが質問者が経験した事だと思われます。

キーボード入力を待つ前に、標準出力(System.out)に「キーボード入力から数値を取り出すプログラムです。データを入力してください」といった説明を表示するようになっていれば、例外は起きなかったでしょうし、原因を調べる手掛かりにもなったと思います。
これが、コードの問題点だと思います。

投稿2016/08/10 06:26

coco_bauer

総合スコア6915

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

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

YukoYasutake

2016/08/10 07:33

そのような説明ができるのですか 知りませんでした・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問