2017-03-24 2 views
-5

사람들이 10 개의 정수를 입력하고 최소에서 최대까지 표시하도록하는 프로그램을 만들고 있습니다. 여기 내 프로그램입니다 :예외가 발생하지 않는 이유는 무엇입니까

가져 오기 java.util.Scanner;

공용 클래스 EnterTenNumbers { 공공 정적 무효 메인 (문자열 []에 args) {

System.out.println("Enter 10 numbers"); 
    int small=0; 
    for(int i=0; i<10; i++){ 
     Scanner in=new Scanner(System.in); 
     int[] i1=new int[10]; 
     int num=in.nextInt(); 
     i1[i]=num; 
     if(i1[i]<i1[i+1] || i1[i]==i1[i+1]){ 
      System.out.println(i1); 
     }else if(i1[i]>i1[i+1]){ 
      i1[i+1]=i1[i]; 
      System.out.println(i1); 
     } 
    } 
} 

}

내가, 사용자 입력 후 번호와 같은 그런 일을 내 프로그램을 실행 "[ I @ 55f96302 "가 나타납니다. 이 작은 수에서 큰 수를 표시해야합니다 동안 10 EnterTenNumbers.main에서 (EnterTenNumbers.java:13) 나타납니다 :

그리고 사용자 후

는 스레드에서 "주요"java.lang.ArrayIndexOutOfBoundsException 10 개 정수, 예외에 들어갔다.

무슨 일이 일어 났습니까?

+0

당신이 불행하게도 게시 니펫 코드에 많은 문제가 있습니다. 다음 게시물을 읽어서 시작하십시오 : http://stackoverflow.com/questions/4455873/java-arraylist-to-store-user-input and http://stackoverflow.com/questions/16252269/how-to-sort-a- arraylist-in-java 및 그것에 또 하나의 균열이 있습니다! :) – muzzlator

+0

잘못된 힌트. 그는 아마 배열을 사용해야하며, 그의 문제는 그가 무엇을하고 있는지를 모른다는 것입니다. 귀하의 링크가 도움이되지 않습니다. – GhostCat

+0

그리고 문제 자체 : 예외 메시지가 말하는 것을 읽으십시오. 해결책은 눈 앞에 있습니다. – GhostCat

답변

1

사용자가 숫자를 입력 한 후에 프로그램을 실행하면 과 같이 "[@ 55f96302"가 나타납니다.

이는 배열 요소가 아닌 배열의 문자열 표현을 인쇄하기 때문입니다.

System.out.println(i1[i]);

와 사용자 후

System.out.println(i1);

교체가 스레드에서 10 개 정수, 예외를 입력 "주" java.lang.ArrayIndexOutOfBoundsException : 10

예외가 명확하게 나타나므로 배열의 10 번째 인덱스 (인덱스는 0부터 시작 함) 또는 11 번째 요소에 액세스하려고합니다. 그러나 당신의 배열에는 단지 10 개의 요소 만 있습니다. 그래서 당신은 AIOOBE이됩니다. 조건문에서 조건 i1 [i + 1]은 i = 9 일 때 i1 [10]이됩니다. 이 문제를 해결해야합니다.

System.out.println("Enter 10 numbers"); 
int small=0; 
for(int i=0; i<10; i++){ 
    Scanner in=new Scanner(System.in); 
    int[] i1=new int[10]; 
    int num=in.nextInt(); 
    i1[i]=num; 
} 
Arrays.stream(i1).sorted().forEach(System.out::println); 
+0

고맙지 만 문제는 이런 식으로 변수 "i1"이 루프 외부에서 선언되어 다른 오류가 발생한다는 것입니다. 배열을 두 번 선언해야합니까? – Yang

+0

@ 양, 절대적으로 맞습니다. 'for' 루프 밖에서 선언해야합니다. 이 수정을 한 후에도 여전히 오류가있는 경우 수정 된 코드를 게시하고 다시 알려주십시오. – VHS

0
  1. 때마다 당신이 입력으로, 당신은 정수의 새로운 배열을 생성하는 번호를 제공하도록 사용자에게 요청하고 있습니다 :

    마지막으로, 당신도 다음과 같은 방법으로 당신의 목표를 달성 할 수있다. 이 10 개의 정수를 저장하기 위해 하나의 배열 만 생성해야합니까? 따라서 정수 배열을 루프 외부에 선언하십시오. 이런 방식으로 단 한 번만 선언됩니다.

  2. 처음부터 사용자로부터 10 개의 정수를 모두 가져와야합니다. 그런 다음이 10 개의 정수를 통해 연산을 실행하여 가장 작은 것에서 가장 큰 것까지 표시해야합니다.

  3. 사용자가 10 개의 정수를 모두 가져 와서 배열에 저장 한 후에는 해당 숫자를 하나씩 반복하여 어느 숫자가 가장 작고 어떤 숫자가 가장 큰지 확인해야합니다. 루프가 배열의 마지막 색인을 검사 할 때 배열의 색인이 존재하지 않기 때문에 해당 배열의 다음 색인을 검사 할 수 없습니다. 그래서 매번 예외가 발생합니다.

    if(i1[i]<i1[i+1] || i1[i]==i1[i+1]){ 
        System.out.println(i1); 
    }else if(i1[i]>i1[i+1]){ 
        i1[i+1]=i1[i]; 
        System.out.println(i1); 
    } 
    
관련 문제