こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

回答の意味が解りません。

class test16 {
public static void main(String args[]) {
int digits = 0;

int letters = 0;
for (int i = 0; i < args[0].length(); i = i + 1) {
char ch = args[0].charAt(i); // 数字
if (Character.isDigit(ch)) digits += 1;
else if (Character.isLetter(ch)) // 英字
letters += 1;
}
System.out.println("There are " + digits + "digits");
System.out.println("There are " + letters + "letters");
}
}


C:\WORK>javac -encoding UTF-8 test16.java

C:\WORK>java test16
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at test16.main(test16.java:5)

お陰様で、コンパイルはできました。

しかし、実行時に、メッセージが出ます。

どうしてでしょうか?

ご回答のほど宜しくお願い申し上げます。



ご回答
argsにデータが入っていないのに
args[0]を参照したからエラーになっています。

public static void main(String[] args)の引数argsは
コマンドプロンプトでjavaコマンド実行時に入力されたデータが入っています。

今回の例だと
C:\WORK>java test16 テスト1 テスト2
のように実行クラス「test16」の後ろにスペースで文字を入力すると
argsには、args = {"テスト1", "テスト2"}のデータが入ります。

質問者さんのjavaコマンドは以下で
C:\WORK>java test16
「test16」の後ろにデータを入れていません。
そのため、args={}となり、データが無いargsが出来上がります。
そのため、args[0]は存在しないからエラーが出ます。


エラーを回避するには
C:\WORK>java test16 「この後に何か文字を入れる」

ボクは「参照」の意味もまだつかめてません。
どいうことですか?
他にも沢山質問があります。
回答者の方も解りやすくご回答なさったと
思いますが、すみません。
今1度、解説のほど、宜しくお願い申し上げます。

投稿日時 - 2018-07-12 20:37:26

QNo.9517640

困ってます

質問者が選んだベストアンサー

>回答No.8 amanojaku1

Javaの場合、オブジェクトは全て「参照型」(ポインタによって「参照」されている)です。
Javaの場合、配列も文字列もオブジェクトなので「参照型」(ポインタによって「参照」されている)です。
プリミティブ型について下記を参照して下さい。

【Java】基本データ型(プリミティブ型)について
https://nobuo-create.net/primitive/

投稿日時 - 2018-07-13 01:11:56

お礼

お陰様で「参照の意味」が少しだけ解りました。

投稿日時 - 2018-07-13 01:24:34

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(9)

ANo.8

>ポインタの場合の「参照」とは、ポインタによる「参照」です。
>配列の"要素"を「参照」するのとは意味が違うので注意して下さい。

添付画像が「プリミティブ型」と「参照型」の模式図です。
配列の場合は、添付画像の「データ」が配列に対応します。

投稿日時 - 2018-07-13 01:02:27

お礼

ご丁寧にありがとうございます。

amanojaku1さんを目指します。

投稿日時 - 2018-07-13 01:04:41

ANo.7

>ポインタの場合の「参照」とは、ポインタによる「参照」です、意味が違うので注意して下さい。

ポインタの場合の「参照」とは、ポインタによる「参照」です。
配列の"要素"を「参照」するのとは意味が違うので注意して下さい。

投稿日時 - 2018-07-13 00:46:12

お礼

ご回答誠にありがとうございました。

ポインタは難しいです。

投稿日時 - 2018-07-13 01:06:08

ANo.6

>ポインタの場合の「参照」とは、ポインタによる「参照」です(何か言葉で言うと意味不明かもしれませんが)。

ポインタの場合の「参照」とは、ポインタによる「参照」です、意味が違うので注意して下さい。

投稿日時 - 2018-07-13 00:42:09

ANo.5

>配列要素の場合では「参照」とは棚の区画の中を見ると言うイメージです

配列の"要素"を「参照」するとは棚の区画の中を見ると言うイメージです
Javaの配列自体が「参照型」(ポインタによって「参照」されている)ですが、意味が違うので注意して下さい。

投稿日時 - 2018-07-13 00:27:27

お礼

ご回答誠にありがとうございます。

投稿日時 - 2018-07-13 00:41:37

ANo.4

配列は棚をイメージして下さい。
添付ファイルの向かって左が「1次元配列」、添付ファイルの向かって右が「2次元配列」と言うイメージです。
配列要素の場合では「参照」とは棚の区画の中を見ると言うイメージです、(「args[0]」とは「args」配列の「0」番目の要素ですので)、「args」と言う名前の棚の「0」番目の区画と言うイメージです。
ポインタの場合の「参照」とは、ポインタによる「参照」です(何か言葉で言うと意味不明かもしれませんが)。

質問の場合は、棚の作成に失敗して、何も入れられない棚を作ってしまったらめに、棚の「0」番目の区画を「参照」しようとしたら、それが存在しないのでエラーになったと言うことです。

投稿日時 - 2018-07-13 00:01:01

お礼

解りやすいご説明、どうもありがとうございました。

投稿日時 - 2018-07-13 00:44:17

ANo.3

>C:\WORK>java test16 テスト1 テスト2
>とはどういったケースに使うのですか?

#2の方もいわれていますけどtest16が何をするプログラムなのか把握していますか?
あなたが自分で作ったわけではなく何かの本やwebサイトに書いてあったプログラムでしょうから、その説明があったと思うのですけど。

書いてあるのを何も考えずにタイプしてコンパイル・実行して「動いたー」「何かエラーが出たー」とかやってる状態だといつまでたっても自分でプログラム組めるようになんてなりませんよ。

投稿日時 - 2018-07-12 23:05:55

お礼

おっしゃる通りですね。

モット、頭を使います。

投稿日時 - 2018-07-13 00:46:06

ANo.2

根本的に「何をするためのプログラムか」と言うことが理解できていないと思われます。

何をするプログラムかわかっていないから、どうやったら動くかもわからないのです。

何をするプログラムかわからないままプログラムを覚えても、何もできないプログラムしか覚えられませんよ。

掲題のプログラムでは、mainに引数として文字列配列「args」が設定されています。
ですから、プログラムの実行には引数である文字列が必ず必要になりますが、あなたは実行時に引数を全く与えていません。エラーが出るのは当然です。

投稿日時 - 2018-07-12 22:34:35

お礼

おっしゃる通りですね。

モット、頭を使います。

投稿日時 - 2018-07-13 00:48:33

ANo.1

args[0] ・・・・・argsの1番目
args[1] ・・・・・argsの2番目

という意味です。

C:\WORK>java test16 テスト1 テスト2
とやれば、

 args[0] ・・・・・テスト1
 args[1] ・・・・・テスト2

となりますが、

C:\WORK>java test16
とやれば、

 args[0] ・・・・・無し
 args[1] ・・・・・無し

となります。
無いものを見ようとすると(参照しようとすると)、エラー(例外)になります。

無いものを見ようとしているのは、
args[0].length()
のところ(5行目)です。

投稿日時 - 2018-07-12 20:47:21

お礼

ご回答誠にありがとうございました。


C:\WORK>java test16 テスト1 テスト2

とはどういったケースに使うのですか?

投稿日時 - 2018-07-12 22:10:46