StormCoding
40
2016-09-26 14:14:42
4
3661

jsp의 처리와 random함수 에러 질문합니다!


수십번을 실행 해봐도 문제 없이 잘 실행이 되지만

console에 뜨는 에러메시지때문에 질문을 드립니다..

일단 에러는 java.lang.IllegalArgumentException: bound must be positive 이 에러가 뜨는데..

검색을 해보니 random함수를 사용함에 있어 0이하의 수가 들어가면 뜬다고 하던데..

실행시 아무 문제도 없는데 처리가 여러번이 되는것 같습니다.

콘솔을 통해 log를 찍었을때 처음 값을 받아 처리하기 전 초기화상태에 한번찍히고 에러가 발생후

값을 받아왔을때 정상처리가 되어 넘어가더라고요...

원래 두번 처리가 되나요? 실행엔 문제가 없지만 이 에러메시지를 없애고 싶기에.. 질문드립니다.

처리 과정은--------------------------------------------------------------------------------------------------------------------------------

main.jsp

$('#result_btn').click(function(){
               location.href="resultPro.jsp?value_list="+value_list;
            });

일단은 main.jsp에서 버튼을 누르면 스크립트를 이용하여 resultPro.jsp로 값을 보내고

resultPro.jsp에서는 받은 값으로 처리만을 하고 resultForm.jsp로 다시 값을 넘겨주는 역할을 합니다.


resultPro.jsp

<%
	  String value_list="";
   	 	 // String value_list = request.getParameter("value_list"); 
	  if(request.getParameter("value_list") != null){
		value_list = request.getParameter("value_list"); 
	  }
   	  StringTokenizer st = new StringTokenizer(value_list,",");   	 
   	  String value_lists[] = new String[st.countTokens()];
   	  int i = 0;  
   	  while(st.hasMoreTokens()){
   		  value_lists[i] = st.nextToken();
   		  i++;
   	  }
		
      String result="";
      Random rd = new Random();
      int index = 0;
      
      List<String> lists = null;
      lists = new ArrayList<String>();
      
      FoodDBBean foodProcess = FoodDBBean.getInstance();
      
         
      if(value_lists.length==3){
         lists = foodProcess.getDessertImg(Boolean.parseBoolean(value_lists[0]), Boolean.parseBoolean(value_lists[1])
                  ,Boolean.parseBoolean(value_lists[2]));
      }
      else if(value_lists.length==4){
      lists = foodProcess.getFoodImg(Boolean.parseBoolean(value_lists[0]), Boolean.parseBoolean(value_lists[1])
                              ,Boolean.parseBoolean(value_lists[2]),Boolean.parseBoolean(value_lists[3]));
      
      }
      
	  index = rd.nextInt(lists.size());
          
      result = lists.get(index);
          
      
    	    
  
      System.out.println(lists);
      System.out.println(result);
      System.out.println(lists.size());
      
      response.sendRedirect("resultForm.jsp?result="+result);
      
   %>

main에서 넘겨주는 value_list의 값은 true,false,true,false 식으로 사용자가 선택한 값이 넘어오구여

그걸 ','를 기준으로 다시 나누어 value_lists에 값을 저장합니다.4번째 줄의 if문을 사용하지 않고 주석처리된 3번째 줄대로 초기화를 하면 NullPointException 에러가 발생하기에 if문으로 null이 아니면 초기화 하는걸로 하였구요, foodProcess.getDessertImg 는 true,false값에 따라 DB에 있는 해당하는 img이름을 반환하는 과정입니다.

그 후에 random함수를 사용하는 곳에서 에러가 뜨는데요,

위 코드대로 하면java.lang.IllegalArgumentException: bound must be positive  에러가 뜨고

콘솔에 찍은 println문이 한번씩만 찍히고 정상적으로 페이지가 넘어가고 실행이 되고요

혹시나해서 밑에 random함수 사용부분을

if(lists.size() >0){     
 index = rd.nextInt(lists.size());
          
 result = lists.get(index);
}     

이렇게 바꾸게 되면 

분명 콘솔출력부분은 저 맨 밑에 3줄 밖에 없는데

[]


0

[nabe.JPG, pepperrisotto.jpg, sausagestew.jpg, spicyseafoodrice.jpg, fishstew.png]

nabe.JPG

5

이것과 java.util.NoSuchElementException 에러 메시지가 뜨네요.. 실행은 정상적으로 되지만..


도움 부탁드립니다.

0
0
  • 답변 4

  • 초계국수1
    178
    2016-09-26 14:32:37

    일단 소스만 봐서

    넘어오는 리스트의 개수가 3~4 개 범위안에 없으면

    리스트는 0개가 되기 때문에 오류가 되고


    인덱스는 0~2 혹은 0~3 범위 안에 있고

    size는 0~3 혹은 0~4 범위 안에 있기 때문에

    index = rd.nextInt(lists.size());

    위 부분을 하면 0~3,  혹은 0~4 중 랜덤 수를 내놓기 때문에


    인덱스를 벗어나게 됩니다.

     

    그래서 오류가 나지 않나 싶네요.


    0
  • StormCoding
    40
    2016-09-26 15:19:05

    첫번째.

    넘어오는 리스트의 개수는 무조건 3~4개이기때문에 0이 나올 수가 없습니다.

    3가지 선택메뉴와 4가지 선택메뉴인데 두개다 무조건 true,false의 값의 사용자 선택 조합으로 넘어오게 됩니다.


    두번째

    lists.size()의 값은 위에서 말했듯이 value_lists의 값이 무조건 3이나 4이기때문에 조건에 걸려

    3일경우 3, 4일경우 4의 값을 가지게 되며 random.nextInt(int)의 값은 0~(int-1)의 값을 가지는것이 아닌가요?


    0
  • 초계국수1
    178
    2016-09-26 15:38:04

    http://stackoverflow.com/questions/32101688/illegalargumentexception-bound-must-be-positive


    다시 찾아보니 첫번째 받아올때 리스트가 empty라서 그런거라고 하네요.

    0
  • StormCoding
    40
    2016-09-26 16:18:18

    으으..이게 여러군데 더 프린트문을 찍어보니 처리 순서가 제가 생각하는데로 순차적으로 처리가 안되서 empty가 되나보네여.. 으.. 감사합니다.. 어딜 손대야할진 아직도 모르겠지만..

    감사합니다!

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.