Был бы признателен за помощь в поиске StringIndexOutOfBoundsException

Эта программа представляет собой строку из 3 чисел, а затем 7 букв, которые должны быть преобразованы в эквивалентное число с использованием методов. Пользовательский ввод - это строка, которая изменяется от букв к цифрам и обратно в строку чисел, разделенных тире. Так что это всего лишь неделя обучения, и меня обманули методами. Код ошибки, который я получаю, говорит мне, что строковый индекс выходит за границы. Итак, я подозреваю, что ошибка в моем преобразовании или где я соединил строки в конце строки 89. Я потратил 20 минут на ТА и был бы признателен за любые рекомендации. Я все еще имею дело с программой, поэтому я пропускаю некоторые из них, потому что мне нужна помощь только тогда, когда я захожу в место, где я застреваю более 45 минут. ОСНОВНОЙ ВОПРОС - Где происходит ошибка и почему? Я пытался повсюду помещать операторы печати, чтобы увидеть, что происходит... однако я могу застрять в цикле.

import java.util.Scanner;
public class ConvPhoneNumTwo{
  public static void main(String[] args){
    String s = getInput();


    printPhone(convertToDigit(s));
  }   

 public static String getInput() { 
      Scanner scan = new Scanner(System.in);
      String s1 = "";
      boolean length = false;
      while (length==false){ 
        System.out.println(" Please enter a telephone number in this format ###-AAA-AAAA") ;
         s1 = scan.nextLine();
        if(s1.length() != 12 ){
          System.out.println( "this is an invalid choice try again Plz..."); 
           length = false;

        }
        else{ 
          length = true; 
        }
      }
      return s1; 
    }

 public static String convertToDigit(String s010){
    s010 = s010.toLowerCase();
    String s001= s010.substring(0,3);
    String s002 = s010.substring(4,6);
    String s003 = s010.substring(8,12);
    String s1 = (s001+s002+s003);
    String s2 = "";

    // Exceptions to our problem to stop invalid inputs 
    if (s1 == null) {
      System.out.print (" invalid input null thing"); 
    }
    if (s1.length() != 10){
      System.out.print (" invalid input"); 
    }

    String s6 = "";
    for (int i=0; i < s1.length(); i++) {


      if (Character.isDigit(s1.charAt(i))){
        s2 += s1.charAt(i); 
      }

      //sorting of the letter inputs 
      char ch = s1.charAt(i); 

      if (ch == 'a'||ch=='b'||ch== 'c'){
        s2 += "2"; 
      }
      if (ch == 'd'||ch=='e'||ch=='f'){
        s2 += "3"; 
      }
      if (ch == 'g'||ch=='h'||ch=='i'){
        s2 += "4"; 
      }
      if (ch == 'j'||ch=='k'||ch=='l'){
        s2 += "5"; 
      }
      if (ch == 'm'||ch=='n'||ch=='o'){
        s2 += "6"; 
      }
      if (ch == 'p'||ch=='q'||ch=='r'|| ch=='s'){
        s2 += "7"; 
      }
      if (ch == 't'||ch=='u'||ch=='v'){
        s2 += "8"; 
      }
      if (ch == 'w'||ch=='x'||ch=='y'|| ch=='z')
      {
        s2 += "9"; 
      }
      else{ 
      }

     String s3 = s2.substring(0,3);
    String s4 = s2.substring(3,6);
    String s5 = s2.substring(6);
     s6 = ( s3 +"-"+ s4 + "-"+ s5);
    }

    return s6; 
    }

    public static void printPhone(String message) { //print out whatever string it is given, basically System.out.println(), but through a method instead
    System.out.println(message);
  }
}

Не уверен насчет того, как много подробностей я могу вложить в это.

1 ответ

Решение

Я думаю, что нашел вашу проблему.

В методе для преобразования ввода в цифры, вы написали это:

String s6 = "";
for (int i=0; i < s1.length(); i++) {

  if (Character.isDigit(s1.charAt(i))){
    s2 += s1.charAt(i); 
  }

  //sorting of the letter inputs 
  char ch = s1.charAt(i); 

  if (ch == 'a'||ch=='b'||ch== 'c'){
    s2 += "2"; 
  }
  if (ch == 'd'||ch=='e'||ch=='f'){
    s2 += "3"; 
  }
  if (ch == 'g'||ch=='h'||ch=='i'){
    s2 += "4"; 
  }
  if (ch == 'j'||ch=='k'||ch=='l'){
    s2 += "5"; 
  }
  if (ch == 'm'||ch=='n'||ch=='o'){
    s2 += "6"; 
  }
  if (ch == 'p'||ch=='q'||ch=='r'|| ch=='s'){
    s2 += "7"; 
  }
  if (ch == 't'||ch=='u'||ch=='v'){
    s2 += "8"; 
  }
  if (ch == 'w'||ch=='x'||ch=='y'|| ch=='z')
  {
    s2 += "9"; 
  }
  else{ 
  }

 String s3 = s2.substring(0,3);
 String s4 = s2.substring(3,6);
 String s5 = s2.substring(6);
 s6 = ( s3 +"-"+ s4 + "-"+ s5);
}

Во-первых, вы проверили, есть ли уже какая-либо цифра во входной строке - если она есть, вы просто добавили цифру в обработанную строку. Затем вы проверили наличие букв и относились к каждой букве соответственно.

Но тогда у вас есть проблема. До завершения строительства обработанной нити s2 (в пределах for цикл), вы пытались извлечь части вашей обработанной строки. Это должно быть сделано после for петля.

Итак, метод должен выглядеть примерно так.

 public static String convertToDigit(String s010){
    s010 = s010.toLowerCase();
    String s001= s010.substring(0,3);
    String s002 = s010.substring(4,6);
    String s003 = s010.substring(8,12);
    String s1 = (s001+s002+s003);
    String s2 = "";

    // Exceptions to our problem to stop invalid inputs 
    if (s1 == null) {
      System.out.print (" invalid input null thing"); 
    }
    if (s1.length() != 10){
      System.out.print (" invalid input"); 
    }

    String s6 = "";
    for (int i=0; i < s1.length(); i++) {


      if (Character.isDigit(s1.charAt(i))){
        s2 += s1.charAt(i); 
      }

      //sorting of the letter inputs 
      char ch = s1.charAt(i); 

      if (ch == 'a'||ch=='b'||ch== 'c'){
        s2 += "2"; 
      }
      if (ch == 'd'||ch=='e'||ch=='f'){
        s2 += "3"; 
      }
      if (ch == 'g'||ch=='h'||ch=='i'){
        s2 += "4"; 
      }
      if (ch == 'j'||ch=='k'||ch=='l'){
        s2 += "5"; 
      }
      if (ch == 'm'||ch=='n'||ch=='o'){
        s2 += "6"; 
      }
      if (ch == 'p'||ch=='q'||ch=='r'|| ch=='s'){
        s2 += "7"; 
      }
      if (ch == 't'||ch=='u'||ch=='v'){
        s2 += "8"; 
      }
      if (ch == 'w'||ch=='x'||ch=='y'|| ch=='z')
      {
        s2 += "9"; 
      }
      else{ 
      }

// They should not be here
/*   String s3 = s2.substring(0,3);
    String s4 = s2.substring(3,6);
    String s5 = s2.substring(6);
     s6 = ( s3 +"-"+ s4 + "-"+ s5);*/
    } // end of for loop; completed constructing s2

// They should be here
String s3 = s2.substring(0,3);
String s4 = s2.substring(3,6);
String s5 = s2.substring(6);
s6 = ( s3 +"-"+ s4 + "-"+ s5);

return s6; 
}
Другие вопросы по тегам