Javaプログラムの要素にアクセスする際にエラーが発生する理由は?

このQ&Aのポイント
  • Javaのプログラムで、配列の最初の要素にアクセスしようとするとエラーが発生する場合、何が原因でしょうか?
  • 基礎的なJavaプログラムで、配列の要素にアクセスしようとしてもエラーが発生します。このエラーの原因は何でしょうか?
  • Javaで配列の要素にアクセスする際にエラーが発生する場合、どのような理由が考えられるでしょうか?
回答を見る
  • ベストアンサー

基礎的な質問ですが

以下のコードを見てください。 class Sort { public Sort() { int[] array = new int[10]; for(int i=0;i<10;i++) { array[i] = i; } } public void HeadPrint() { System.out.println(this.array[0]); } } 最初のSortで0~9の数字を含むarrayを作って、 HeadPrint内で、arrayの最初の要素にアクセスしてその値を 表示したいのですが、 this.array[0]ではエラーが発生します。 何が悪いのでしょうか? アドバイスよろしくお願いします

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.1

エラーは、「arrayは解決できないか…」ってやつですよね。 変数arrayが、クラス変数として宣言されていないからです。 Sort()の中に宣言しているarrayは、ローカル変数というやつで、 Sort()の中でしかアクセスできません。 試しに、コンストラクタSort()の中の int[] array = new int[10]; を、外に出してください。 class Sort { private int[] array = new int[10]; //こうすればクラス変数なのでHeadPrint()メソッドからもアクセスできる。 public Sort() { for(int i=0;i<10;i++) { array[i] = i; } } //後は省略 これでどうでしょうか。

ilnmfay
質問者

お礼

回答ありがとうございます。 ローカル変数とクラス変数の違いの問題ですね。 アドバイスありがとうございます。

関連するQ&A

  • Javaのプログラムに関する質問です。

     以下のプログラムはコマンドライン引数で複数の数字を  受け取り、int型配列arrayに受け取った値を代入して  arrayの先頭から順番に表示しています。    変換クラスと、表示クラスを作成し  (1)の部分を変換クラスで、  (2)の部分を表示クラスで行うように修正してください。 */ class ClassAdd08{  public static void main(String[] args){   HenkanClass subA = new HenkanClass();//HenkanClassのインスタンス化   subA.henkan(len,array);//変換メソッドの呼び出し   HyoujiClass subB = new HyoujiClass();//HyoujiClassのインスタンス化   subB.hyouji();//表示メソッドの呼び出し  } }   //****************************     (1)     ********************************** class HenkanClass{//変換クラスを新規作成  public void henkan(){//変換メソッド   int len = args.length;   int[] array = new int[len];   for(int i = 0; i < len; i++){    array[i] = Integer.parseInt(args[i]);   }  } }    //****************************     (1)     **********************************    //****************************     (2)     ********************************** class HyoujiClass{//表示クラスを新規作成  public void hyouji(){//表示メソッド   System.out.println("受け取った引数:" + len + "個");      for(int i = 0; i < len; i++){    System.out.println((i + 1) + "個目の数:" + array[i]);   }  }   //****************************     (2)     ********************************** } クラスのインスタンス化と、対応するメソッドまでは作成したのですが、その後どうすればいいか分かりません。考え方やヒントなど、皆様の知恵をどうかお貸しください。お願い致します。

  • javaのシェルソートについて質問です

    //Sample482 import java.util.Random; class Sample482{ static int shellSort1(int[] x){ int n = x.length; int cnt = 0; for(int h = n/2;h > 0;h /= 2){ for(int i = h;i < n;i++){ int tmp = x[i]; int j; for(j = i;j > h-1 && x[j-h] > tmp;j -= h){ cnt++; x[j] = x[j-h]; } x[j] = tmp; } } return cnt; } public static void main(String[] args){ Random rand = new Random(); int n = 20000; int[] x = new int[n]; for(int i = 0;i < n;i++){ x[i] = rand.nextInt(1000000); } int cnt = shellSort1(x); System.out.println("昇順にソートしました。"); for(int i = 0;i < n;i++){ System.out.println("x[" + i + "]=" + x[i]); } System.out.println("要素の移動回数" + cnt); } } //Sample483 import java.util.Random; class Sample483{ static int shellSort2(int[] x){ int n = x.length; int cnt = 0; int h; for(h = 1;h < n/9;h = 3*h+1); for(;h > 0;h /= 3){ for(int i = h;i < n;i++){ int j; int tmp = x[i]; for(j = i-h;j >= 0 && x[j] > tmp;j -= h){ x[j+h] = x[j]; cnt++; } x[j+h] = tmp; } } return cnt; } public static void main(String[] args){ Random rand = new Random(); int n = 20000; int[] x = new int[n]; for(int i = 0;i < n;i++){ x[i] = rand.nextInt(1000000); } int cnt = shellSort2(x); System.out.println("昇順にソートしました。"); for(int i = 0;i < n;i++){ System.out.println("x[" + i + "]=" + x[i]); } System.out.println("要素の移動回数:" + cnt); } } 上記のSample482とSample483はどちらもシェルソートを扱ったコードです。 参考書やネットの情報によると、後者のSmple483のシェルソートの方がより高速にソート することができるらしいのですが、実際に実行してみると、要素の移動回数は Sample482よりSample483の方が多くなります。 要素の移動回数が多いということは、それだけソートに時間がかかると私は思うのですが、 何故、後者のシェルソートの方が高速に動くといえるのでしょうか?

  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • 文字列を整数に型変換してソート

    コマンドライン入力で文字列を入力してそれを整数型に変換。そして、それをソートするプログラムを作ってるんですが、なぜかうまくいかず、出力される数字がすべて0になります。 どなたかヘルプおねがいします>< class sort32 { public static void main(String[] args) { System.out.println("------------------------"); int i=0; int j=i+1; int vals[]; vals = new int[args.length]; for(i=0;i>args.length ;i++) { vals[i] = Integer.parseInt(args[i]); } java.util.Arrays.sort(vals); for(int k=0; k<vals.length; k++) System.out.println("<"+vals[k]+">"); } }

  • java(バブルソート/単純挿入ソート)

    以下のプログラムを「バブルソートもしくは単純挿入ソートのプログラムに変更しなさい」という課題が出ました。 どのようにすればよろしいでしょうか? import java.util.*; public class SelectSort { //プログラムクラス名 //整列プログラム public static void main(String[] args){ //整列用 int 型配列 int[] target; int elems = KeyboardInput.askInt("要素数? "); //配列を乱数で初期化する target = setArray(elems); //初期状態を表示 display(target); //整列メソッドの呼び出し sortArray(target); //整列結果の表示 display(target); } //配列を乱数で初期化するメソッド static int[] setArray(int elems){ // 要素数個の int 型変数の確保 int[] array = new int[elems]; //乱数利用ための宣言 Random generator = new Random(); //乱数の最大値・最小値 int max = 100; int min = 0; //generator.nextDouble() で 0から1までのdouble型乱数発生 for(int i=0 ; i<array.length ; i++) { array[i] = (int)((max-min)*(generator.nextDouble())+min); } return array; } //配列の状態を表示 static void display(int[] array){ for(int i=0 ; i<array.length ; i++) { System.out.print(array[i]+" "); } System.out.println(""); } static void sortArray(int[] array){ //配列のはじめから最後まで繰り返す for( int i = 0; i < array.length-1 ; i++){ int min_id = i; int min = array[i]; //範囲中でもっとも小さい要素を探す for( int j=i+1 ; j< array.length ; j++ ) { if( array[j] < min ){ min = array[j]; min_id = j ; } } //範囲の始めと置き換える int tmp = array[i]; array[i] = array[min_id]; array[min_id] = tmp; //display(array); } } }

  • 並び換えるクラスについて

    小さい順に並べかえをテストするクラスが下のように指定されている場合、 小さい順に並べかえ処理をするクラスはどのようにすればいいのでしょう? class SortTest{ public static void main(String[] args){ int[] arri = {3, 2, 8, 7, 4, 6, 1, 0, 5, 9}; System.out.println(); System.out.print("\tソート前:"); arrayPrintln(arri); tool.Sort.ascendBubble(arri); // クラスメソッドに処理を委譲 System.out.print("\tソート後:"); arrayPrintln(arri); System.out.println(); double[] arrd = {3.3, 2.2, 8.8, 7.7, 4.4, 6.6, 1.1, 0.0, 5.5, 9.9}; System.out.println(); System.out.print("\tソート前:"); arrayPrintln(arrd); tool.Sort.ascendBubble(arrd); // クラスメソッドに処理を委譲 System.out.print("\tソート後:"); arrayPrintln(arrd); System.out.println(); } //配列の値を出力するメソッド******************* public static void arrayPrintln(int[] arr){ for(int i=0; i<arr.length; i++){ System.out.print(arr[i] + " "); } System.out.println(""); } public static void arrayPrintln(double[] arr){ for(int i=0; i<arr.length; i++){ System.out.print(arr[i] + " "); } System.out.println(""); } } 初心者な私がggったりして作成したやつが↓です。 class Sort{ public ascendBubble(int[] arri); public ascendBubble(double[] arri); //public void getArri(){ //public void getArri(String[] arri){ public void getArri(int[] arri){ for(int i=0;i<arri.length-1;i++){ for(int j=arri.length-1;j>i;j--){ if(arri[j]<arri[j-1]){ int t=arri[j]; arri[j]=arri[j-1]; arri[j-1]=t; } } } } public void getArri(double[] arri){ for(int i=0;i<arri.length-1;i++){ for(int j=arri.length-1;j>i;j--){ if(arri[j]<arri[j-1]){ int t=arri[j]; arri[j]=arri[j-1]; arri[j-1]=t; } } } } } わかりずらいかと思いますが、 アドバイスの方よろしくお願いします。

  • 質問です。

    コンパイルはできるのですが、実行すると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
  • Threadに関するの質問

    このプログラムに synchronized , wait(), notify()を加えることで、 stackBody[]配列をオーバーやアンダーフローしないようにできるのでしょうか。お助け下さい! public class test { public static void main(String args[]) { Stack stack = new Stack(5); Pusher pusher = new Pusher(stack); Popper popper = new Popper(stack); pusher.start(); popper.start(); } } class Stack { private int stackSize; private int stackPointer; private int stackBody[]; public Stack(){ this(10); } public Stack(int size){ stackSize = size; stackBody = new int[size]; stackPointer = 0; } public void push(int value){ if(stackSize == stackPointer){ // } stackBody[stackPointer++] = value; } public int pop(){ if(stackPointer == 0){ // } return stackBody[--stackPointer]; } } class Pusher extends Thread { Stack s; public Pusher(Stack s) { this.s = s; } public void run() { int n, interval; for(int i = 0; i < 10; i ++) { n = (int)(100.0 * Math.random()); interval = (int)(100.0 * Math.random()); s.push(n); System.out.println("Pusher:" + n); try{ Thread.sleep(interval); }catch(InterruptedException e) {} } System.out.println("Push 終了"); } } class Popper extends Thread { Stack s; public Popper(Stack s) { this.s = s; } public void run(){ int n, interval; for(int i = 0; i < 10; i++){ interval = (int)(100.0 * Math.random()); n = s.pop(); System.out.println("Popper:" + n); try{ Thread.sleep(interval); }catch(InterruptedException e) {} } System.out.println("Popper 終了"); } }

    • ベストアンサー
    • Java
  • StringクラスのcompareToメソッド

    ArrayListに登録した文字列を五十音順にソートしようと思いComparator を使用して 以下のようなサンプルプログラムを作ってみました。 ところが想定していたような {赤ちゃん、富士山、山口県}とはならず {富士山、山口県、赤ちゃん} というような結果になりました。 compare() の戻り値の部分を return ((String)arg1).compareTo((String)arg0); に変更しても{赤ちゃん、山口県、富士山} となり辞書の並びとは異なる結果になりました。 辞書順に並べるにはなにかよい方法はありますでしょうか。 public class compareTest { public static void main(String[] args) { ArrayList<String> array = new ArrayList<String>(); String a = "赤ちゃん"; String b = "山口県"; String c = "富士山"; array.add(a); array.add(b); array.add(c); for(int i=0;i<array.size();i++) { System.out.println("ソート前=" + array.get(i)); } Collections.sort(array, new testComp()); for(int i=0;i<array.size();i++) { System.out.println("ソート後=" + array.get(i)); } } } public class testComp implements Comparator { public int compare(Object arg0, Object arg1) { return ((String)arg0).compareTo((String)arg1); } }

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

    JAVAの質問です。 javaでスロットを作りたいのですが…。 3行3列で縦と横同じ数字の場合”おめでとう”と表示されるプログラムを作りたいのですがわからないです。 助けてください(>_<) public class surotto { public static void main(String args[]) { int hako[][]; int i,j; hako = new int[3][3]; System.out.println("スロットスタート。"); for(i=; i<3; i++){ for(j=0; j<3; j++){ hako[i][j] = (int)(Math.random()*10); } } for(i=0; i<3; i++){ for(j=0;j<3;j++){ System.out.println([i][j]); } System.out.println("\r\n"); } for(i=0; i<3 ; i++){ if((hako[i][0] == hako[i][1]) && (hako[i][1] == hako[i][2])){ System.out.println("横がそろいました、おめでとう\n"); } } for(j=0; j<3 ; j++){ if((hako[0][j] == hako[1][j]) && (hako[1][j] == hako[2][j])){ System.out.println("縦がそろいました、おめでとう\n"); } }

    • ベストアンサー
    • Java

専門家に質問してみよう