2017-01-13 3 views
-2

Это функция accept для моей программы tic tac toe, поэтому s будет хранить данные только в формате String и между 0,0 или 2,2.StringIndexOutOfBoundsException при использовании Character.getNumericValue

Я теперь с помощью функции getNumericValue для хранения чисел в p и q соответственно, но во время выполнения, я получаю StringIndexOutOfBounds исключение, при попытке сохранить значение в p.

Проблема происходит только тогда, когда функция выбора(), чтобы решить й или O вызывается перед принимать() еще он работает нормально. В чем проблема с выбором() funtion?

void accept()throws IOException 
{ 
    System.out.println("Your move:"); 
    String s=xy.readLine(); 

    int p = (Character.getNumericValue(s.charAt(0)))-1; 
    int q = Character.getNumericValue(s.charAt(2))-1; 
    if(ar[p][q]==0) 
     ar[p][q]=1; 
    else 
    { 
     System.out.println("You can't capture a location that has already been captured!"); 
     accept(); 
    } 
} 



void choice() throws IOException 
    { 
     System.out.println("Welcome to tictactoe"); 
     System.out.print("Enter your weapon X or O : "); 
     chp = Character.toUpperCase((char)xy.read()); 

     if (chp=='X') 
      chc='O'; 
     else 
      chc = 'X'; 

     System.out.println("kkbot chose: "+ chc); 
    } 
+3

Прочитайте [документацию для 'String.charAt'] (https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#charAt (целое)). Вы получаете 'StringIndexOutOfBoundsException', если указанный вами индекс равен> = длина строки. Другими словами, '' 'меньше двух символов, что делает' 2' недопустимым индексом? – qxz

+0

Что такое формат ввода? –

+0

Строка @ShyamBaitmangalkar. Даже после ввода правильного ввода в правильном формате s всегда сохраняет пустую строку по какой-либо причине, а Character.getNumericValue возвращает -1. –

ответ

0

Привет, я, наконец, нашел проблему в коде. Функция choice() принимает символ, но после этого, когда строка принимается, вместо того, чтобы дать пользователю возможность ввести строку, машина автоматически принимает значение null в качестве входной строки (создается при нажатии пробела после символа).

Эта проблема возникает всякий раз, когда вы пытаетесь принять строку или любой другой тип данных после CHAR.

Я также нашел способ взломать эту проблему. :)

import java.io.*; 
class tictactoe 
{ 
    BufferedReader xy=new BufferedReader(new InputStreamReader(System.in)); 
    void accept()throws IOException 
    { 
     System.out.println("Enter your weapon X or O : "); 
     char ch = xy.readLine().charAt(0); 

     System.out.println("Your move:"); 
     String s=xy.readLine(); 
    } 
} 
1

Ваша проблема:

Это функция принимает для моего Tic Tac Toe программы, так что S только собирается хранить данные в формате и между 0,0 или 2, 2.

Но делает ваш код:

String s=xy.readLine(); 
int p = (Character.getNumericValue(s.charAt(0)))-1; 
int q = Character.getNumericValue(s.charAt(2))-1; 

Пользователь может ввести все, что он хочет. Nothing в readLine() помешает ему добавить пустую или слишком длинную строку!

Перед тем, как сделать что-нибудь с этой строки, у вас есть Validate, что она имеет предполагается длину; как в:

String inputFromUser = ""; 
do { 
    System.out.println("Your move [enter a value like A1]: "); 
    inputFromUser = scanner.readLine(); 
} while (inputFromUser.length != 2); 

Beyond что: используйте реальные имена для переменных. s, xy, p, q ... скажите читателю ничего о целях этих переменных. Да, вы сохраняете немного времени при наборе текста; и вы потратите 10 раз на это время, когда читаете свой исходный код позже; и вы значительно увеличиваете вероятность глупых опечаток с этими уродливыми односимвольными именами!

0

Если вы вообще пытаетесь сохранить значения, такие как 0,0 или 1,1 в двух отдельных переменных int, это должен быть прямой процесс. Однако вы должны принять меры предосторожности для ошибочных данных. Таким образом, ваш метод accept() должно быть что-то вроде этого:

public void accept(){ 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Your move [Enter marking position in the form x,y]: "); 
     String userInput = sc.nextLine(); 
     String[] userMarkedPositions = userInput.split(","); 
     if(userMarkedPositions.length == 2){ 
      int x = Integer.parseInt(userMarkedPositions[0]); 
      int y = Integer.parseInt(userMarkedPositions[1]); 
      //Followed by your other operations 
      //.... 
      //.... 
     }else{ 
      System.out.println("Invalid input!!"); 
      System.out.println("Input should be in the form of x,y"); 
      accept(); 
     } 
     sc.close(); 
    } 

И точно так же, как @GhostCat справедливо говорил, вы должны использовать правильные имена для переменных. Это улучшает читаемость вашего кода.