

独学でまったりと学んでいる初心者です。現在Javaのキー入力がうまくいかず困っています。  
コマンドプロンプト上の処理で整数を入力させるというものなのですが１を押し、`Enter`を押すと`java.lang.ArrayIndexOutOfBoundsException`が出てきます。  
自分の中ではEnterのせいで動作不良が起きているのかなという目星をつけているのですがその場合でもどうすればいいかが思い浮かびません。動作不良の原因、改善点を挙げて説明してもらえると助かります。また、ソースコードを見て改善するべき点があれば遠慮なくダメ出ししてもらえると助かります。  
※プログラム自体はフィボナッチ数列の第n項目を表示するというものです。作業環境はEclipseです  

↓以下ソースコード

[code]

    package フィボナッチ数列;
    
    import java.util.InputMismatchException;
    import java.util.Scanner;
    
    public class Fibonacci {
         /*
         * フィボナッチ数列の第n項を表示したい
         */
    
        int fibonacci_number[];
        int number;
        int n;
    
        //実行
        public static void main(String args[]){
            new Fibonacci();
        }
    
        public Fibonacci(){
            System.out.println("フィボナッチ数列の第n項を調べてやる、です");
            System.out.println("好きな数を打ちやがれ、です");
    
               Scanner scan = new Scanner(System.in);   //キーイベント
               try {
                   int input= scan.nextInt();
                   fibonacci_number = new int[input];   //配列生成
                   fibonacci_number[0] = 0;
    
                   fibonacci_number[1] = 1;
                   calculation(input);
               }catch(InputMismatchException e){        //入力が数字以外の場合
                   System.out.println("数字入れろって言ってるダルォ！？");
                   return;
               }
    
            fibonacci_number = new int[n];
        }
    
        public void calculation(int x){
            n = x;  //入力された文字をnへ
            if( n < 3){                     //入力が３未満だった場合
                if(n == 1 ){                //一番目(０)を表示
                    printresult(fibonacci_number[0]);
                }
                else if(n == 2){            //二番目(１)を表示
                    printresult(fibonacci_number[1]);
                }
            }else{                          //ループに入る
                for(int i=0;i<n-2;i++){
                    int two_before = i;     //二個前
                    int before = i++;           //一個前
                    int ans = fibonacci_number[two_before] + fibonacci_number[before];
                    fibonacci_number[i+2] = ans;
                }
    
                printresult(fibonacci_number[n]);   //計算結果表示
            }
    
        }
        //結果を表示する
        public  void printresult(int s){
            System.out.println("フィボナッチ数列の第"+ n + "項目の数は"+ s + "です。");
        }
    }
    
[/code]


CC BY-SA 3.0
2017-07-23T13:37:09.610
36616
2017-07-24T02:20:48.263
2017-07-23T14:01:03.173
21092
24534
question
java コマンドプロンプト
Javaでコマンドプロンプト上の入力を処理したい


要素数が1の配列を生成しているにもかかわらず、

[code]

    fibonacci_number = new int[input];   //配列生成
    
[/code]

2番目の要素にアクセスしているので、

[code]

    fibonacci_number[1] = 1;
    
[/code]

`ArrayIndexOutOfBoundsException`がスローされます。

* * *

補足すると、

[code]

    int before = i++;
    
[/code]

これでは、beforeには+1される前のiが代入されます。

[code]

    n = x;  //入力された文字をnへ
    
[/code]

変数`n`に`x`を代入する必要はありません(してもいいですが)。

[code]

    new Fibonacci();
    
[/code]

new(インスタンスを生成)する必要性も無いです(してもいいですが)。

[code]

    int number;
    
[/code]

フィールド変数`number`は使われてないので、削除した方がいいですね。

[code]

    fibonacci_number = new int[n];
    
[/code]

この行は不要です(意味がありません)。

[code]

    package フィボナッチ数列;
    
[/code]

パッケージ名などに日本語を使うのはあまりお勧めできません(可能ですが)。

【参考】  
[Javaのソースコード中に日本語を使う](http://qiita.com/shinido/items/d5401c069a681eb1910a)

10行ほど修正すれば、正常に動作するようになります。頑張って下さい。


CC BY-SA 3.0
2017-07-23T13:48:40.743
36618
2017-07-24T02:20:48.263
2017-07-24T02:20:48.263
21092
21092
36616
answer