Javaコンパイル実行時のエラーについて

このQ&Aのポイント
  • Javaのコンパイルは成功したが、実行時にエラーメッセージが表示される理由について説明します。
  • Javaのコンパイル時には問題なく成功したが、実行時に「java.lang.ArrayIndexOutOfBoundsException: 0」というエラーが発生する問題について解説します。
  • Javaのコンパイルは正常に行われますが、実行時に「java.lang.ArrayIndexOutOfBoundsException: 0」というエラーメッセージが表示される原因についてご説明します。
回答を見る
  • ベストアンサー

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

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度、解説のほど、宜しくお願い申し上げます。

  • Java
  • 回答数9
  • ありがとう数16

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

  • ベストアンサー
回答No.9

>回答No.8 amanojaku1 Javaの場合、オブジェクトは全て「参照型」(ポインタによって「参照」されている)です。 Javaの場合、配列も文字列もオブジェクトなので「参照型」(ポインタによって「参照」されている)です。 プリミティブ型について下記を参照して下さい。 【Java】基本データ型(プリミティブ型)について https://nobuo-create.net/primitive/

jump7799
質問者

お礼

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

その他の回答 (8)

回答No.8

>ポインタの場合の「参照」とは、ポインタによる「参照」です。 >配列の"要素"を「参照」するのとは意味が違うので注意して下さい。 添付画像が「プリミティブ型」と「参照型」の模式図です。 配列の場合は、添付画像の「データ」が配列に対応します。

jump7799
質問者

お礼

ご丁寧にありがとうございます。 amanojaku1さんを目指します。

回答No.7

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

jump7799
質問者

お礼

ご回答誠にありがとうございました。 ポインタは難しいです。

回答No.6

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

回答No.5

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

jump7799
質問者

お礼

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

回答No.4

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

jump7799
質問者

お礼

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

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.3

>C:\WORK>java test16 テスト1 テスト2 >とはどういったケースに使うのですか? #2の方もいわれていますけどtest16が何をするプログラムなのか把握していますか? あなたが自分で作ったわけではなく何かの本やwebサイトに書いてあったプログラムでしょうから、その説明があったと思うのですけど。 書いてあるのを何も考えずにタイプしてコンパイル・実行して「動いたー」「何かエラーが出たー」とかやってる状態だといつまでたっても自分でプログラム組めるようになんてなりませんよ。

jump7799
質問者

お礼

おっしゃる通りですね。 モット、頭を使います。

  • Kaneyan-R
  • ベストアンサー率42% (1248/2909)
回答No.2

根本的に「何をするためのプログラムか」と言うことが理解できていないと思われます。 何をするプログラムかわかっていないから、どうやったら動くかもわからないのです。 何をするプログラムかわからないままプログラムを覚えても、何もできないプログラムしか覚えられませんよ。 掲題のプログラムでは、mainに引数として文字列配列「args」が設定されています。 ですから、プログラムの実行には引数である文字列が必ず必要になりますが、あなたは実行時に引数を全く与えていません。エラーが出るのは当然です。

jump7799
質問者

お礼

おっしゃる通りですね。 モット、頭を使います。

回答No.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行目)です。

jump7799
質問者

お礼

ご回答誠にありがとうございました。 C:\WORK>java test16 テスト1 テスト2 とはどういったケースに使うのですか?

関連するQ&A

  • プログラムの合体。

    jump7799_4836さん 2018/7/2103:34:44 public class Test2 { public static int メソッド () { System.out.println("メソッド()が呼ばれました"); return 0; } public static int メソッド (int i) { System.out.println("メソッド(int i)が呼ばれました"); return i; } public static int メソッド (int i, int j) { System.out.println("メソッド(int i, int j)が呼ばれました"); return i; } public static int メソッド (short s) { System.out.println("メソッド(short s)が呼ばれました"); return s; } public static int メソッド (double d) { System.out.println("メソッド(double d)が呼ばれました"); return (int) d; } } public メソッド class Test2 { public メソッド static void main(String[] args) { Test2.メソッド (); Test2.メソッド (1); Test2.メソッド (1,2); Test2.メソッド (1.1); Test2.メソッド ((short) 1); Test2.メソッド ((double)1); } } kouzou@GD348ZZD9:/WORK$ javac Test2.java Test2.java:29: エラー: class、interfaceまたはenumがありません public メソッド class Test2 { ^ Test2.java:30: エラー: <identifier>がありません public メソッド static void main(String[] args) { ^ エラー2個 2つのプログラムが合体することってあるのですか? いつもすみません。 解説のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • Java、実行時にエラーになります。

    class test14 { public static void main(string args[]) { byte b; int i = 258; b = (byte)i; System.out.println(b); //2を表示する } } C:\WORK>javac test14.java C:\WORK>java test14 エラー: メイン・クラスtest14を検出およびロードできませんでした 原因: java.lang.ClassNotFoundException: test14 いつも教えてもらってばかりですいません。 上記のプログラム、コンパイル出来ましたが 実行時、エラーになります。 どうしてでしょうか? 教えてください。 ご回答のほど宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • 質問です。

    コンパイルはできるのですが、実行するとExption in thread"main"java.lang ArrayIndex0ut0fBoundsExcept ion :0 at java1_1.main(java1_1.java:19と表示をされてしまってできません。教えてください。宜しくお願いします。 /* 実行時引数を受け取り乱数を設定 */ class java1-1 { public static void array_syokika(int a[]) { for(int i = 0; i < a.length; i++) { a[i] = (int)(100 * Math.random()); } } public static void main(String args[]) { int num = Integer.parseInt(args[0]); int a[] = new int[num]; array_syokika(a); for(int i = 0; i < a.length; i++) { System.out.println("a[" + i + "]=" + a[i]); } } }

    • ベストアンサー
    • Java
  • Integerについて

    class Sample5_7_Integer { /** * Integerクラスのメソッド */ public static void main(String[] args) { //String → int int i1 = Integer.parseInt(args[0]); //int型にすることにより計算可能 System.out.println(i1 + 100); //String → integer Integer i2 = Integer.valueOf(args[0]); System.out.println(i2); Integer i3 = new Integer(100); System.out.println(i2.equals(i3)); } } をEclipseで実行したところ、 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at benkyou.Sample5_7_Integer.main(Sample5_7_Integer.java:10) というエラーになってしまいます。 どなたか解決法をお願いします。

    • ベストアンサー
    • Java
  • エラーメッセイジの意味は2

    javaの勉強中です。次のソースコードを作成しました ファイル名はMyOperator1.java です。 /** * 演算子の使用例1(加減剰余、剰余) * / public class MyOperator1 { public static void main (String)[] args) { int i= 20 ; int J= 3 ; // 足し算 int plus = i+j; // 引き算 int minus = i-j; // 割り算 int div = i/j ; // 掛け算 int multi = i*j ; // 剰余 int mod = i%j; System.out.println (i+"+"+j+"="+plus) ; System.out.println (i+"-"+j+"="+minus); System.out.println (i+"/"+j+"=" +div); System.out.println (i+"*"+j+"="+ multi); System.out.println (i+"%"+j+"="+mod); } } このソースコードをコンパイルしたら C:\Documents and Settings\NEC-PCuser\java\5_1_5>javac MyOperator1.java MyOperator1.java:1: コメントが閉じられていません。 /** ^ MyOperator1.java:28: 'class' または 'interface' がありません。 ←(ココにヤマ括弧) というエラーメッセイジがでました そのエラーメッセイジの意味がわかりません。 そもそもコンピュータ入門書には予想されるエラーメッセイジを具体的に全て掲載してくれません(きりがないから?)。 やはり独学は無理なのでしょうか?

    • ベストアンサー
    • Java
  • コンパイル時のエラー。

    いつも大変お世話になりありがとうございます。 初心者向けのJAVAの件。 コンパイルが下記の通りになりました。 どこが間違っているのでしょうか? アドバイスのほど、宜しくお願い申し上げます。 C:\JAVA>javac Lesson09.java C:\JAVA>java Lesson09 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at Lesson09.main(Lesson09.java:4) コード public class Lesson09 { public static void main(String[] args) { int x, y; x = Integer.parseInt(args[0]); y = Integer.parseInt(args[1]); java.awt.Point point = new java.awt.Point(); point.setLocation(x, y); System.out.println("X, Y座標をフィールドで参照します(int)"); System.out.println("X 座標:" + point.x); System.out.println("Y 座標:" + point.y); System.out.println("X, Y座標getメソッドで参照します(double)"); System.out.println("X 座標:" + point.getX()); System.out.println("Y 座標:" + point.getY()); } }

    • ベストアンサー
    • Java
  • クラスTest4を検出およびロードできませんでした

    import java.util.Arrays; public class Test4{ public static void main(String[] args){ int [] array = {298,827,8348,29,892,327,8,9,2,809,32}; System.out.println("配列の要素を表示します。"+ Arrays.toString(array)); System.out.println("Arraysクラスを利用しないと、" + array + "となってしまう"); } } kouzou@GD348ZZD9:/WORK$ java Test4 エラー: メイン・クラスTest4を検出およびロードできませんでした 原因: java.lang.ClassNotFoundException: Test4 コンパイルはできたのですが、実行でエラーが出ました。 何故でしょうか? 教えてください。 ご回答のほど宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • すいません。超初心者です…。

    今、プログラミングの練習をしています。言語はjavaです。独学なので、立ち止まったら対処ができません。一応、本の通りにやっているつもりなのですが… 本を書き写した所、コンパイル(コンパイラ?、インタープリタ?)が出来ません。 お分かりの方がいらっしゃいましたら、是非ご教授下さい。お願いします。 class Test{ int i = 10; int j = i * 2; int sum(int m){ return j + m; } int sum3(int m,int n){ int k = sum(3); return m + n + k; } } public class sample31{ public static void main(String[] args) { Test t = new Test(); System.out.println("tオブジェクトのメソッド" + "sum3(1,5)の結果:" + t.sum3(1,5)); } } ちなみにエラーの文は、 C:\Source>java sample31 Exception in thread "main" java.lang.NoSuchMethodError: Test.sum3(II)I at sample31.main(sample31.java:17) という風に出ています。(意味は分かりませんが…)

    • ベストアンサー
    • Java
  • Java問題 できればソースコードを教えて下さい。

    import java.io.*; public class K2 { public static void main(String[] args) { int[] test = new int[5]; test[0] = 80; test[1] = 60; test[2] = 22; test[3] = 50; test[4] = 75; int i = 0; while(i<test.length){ System.out.println((i+1) + "番目の人の点数は" + test[i] + "です"); i++; } } } のプログラムと同様の配列を準備し,その内容をwhile文を用いて画面に表示するプログラムを作成しなさい.その際,全データの合計値と平均値も出力しなさい お願いします

    • ベストアンサー
    • Java
  • arraycopy コンパイルエラー

    javaの勉強をしているのですが arraycopy()を使ったプログラムでエラーが出てしまいます。 class Ex97{ public static void main(String args[]){ int []a = new int[10]; int []b = new int[5]; for(int i=0; i<10; i++){ a[i] = (int)(Math.random()*10); } System.arraycopy(a, 2, b, 0, 5); for(int i=0; 0<a.length-1; i++){ System.out.println(a[i]); } System.out.println(""); for(int i=0; 0<b.length; i++){ System.out.println(b[i]); } } } /*メッセージ Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 at Ex32.main(Ex32.java:13) */ このプログラムはaの3番目の要素から5つ分の内容をbへコピーする というものです。 ご回答よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう