2015-03-11 5 views
-3

Мне нужно получить последние четыре символа из строки, но каждый раз, когда я вводил что-то, я получаю StringIndexOutOfBoundsException. Пожалуйста, помогите мне решить эту ошибку.Я хочу получить последние четыре символа строки

import java.util.Scanner;//need for Scanner 
import java.io.*; 
public class PansiyuA3Q2 { 


    public static void main(String[] args)throws Exception { 
    Scanner autoFile = new Scanner(new File("AutoCorrectMe.txt")); 
    String a =getFileName(); 
    } 
    static String getFileName(){ 
    Scanner keyboard = new Scanner(System.in);//need for Scanner 
    String a ="";//variable a 
    String change = "";//get the last four character 
    boolean valud ;//boolean valud 
    int length = a.length(); 
    do{ 
     System.out.println("Enter the name of the file: ");//print Enter the name of the file: 
     a= keyboard.nextLine();//get from user 
     change = a.substring(length-4,length); 
     if(change.equalsIgnoreCase(".txt"))//a equal autocrrectme.txt and ignore capital 
     valud = true;//get true 
     else //if a equal atuocorrectme and ignore capital 
     System.out.println("The file name must end with .txt");//print The file name must end with .txt 
     valud = false;//get false 
    } while(!valud);//do while 
    return a; 
    }//method getFilName 

} 

Я могу скомпилировать его, но когда я запускаю программу, независимо от слова, которое я вводил, он говорит, что есть ошибка.

java.lang.StringIndexOutOfBoundsException: String index out of range: -4 
    at java.lang.String.substring(Unknown Source) 
    at PansiyuA3Q2.getFileName(PansiyuA3Q2.java:22) 
    at PansiyuA3Q2.main(PansiyuA3Q2.java:11) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 
+2

Тогда что? Вы просто сдались, когда увидели исключение? Что привело ваша отладка? Не просто сбрасывайте свои программы здесь. Объясните, в чем проблема и почему это происходит. –

+3

Длина a равна 0. Запустите отладчик, и вы увидите, что не так. –

+1

Или подумайте, откуда должно исходить число -4 в трассе стека. –

ответ

1

Вы заявляете и инициализировать length прежде чем вы получите a от пользователя.

// int length = a.length(); 
do { 
    System.out.println("Enter the name of the file: "); 
    a = keyboard.nextLine();//get from user 
    int length = a.length(); 
    if (length < 4) { 
     continue; // <-- reloop if less then 4. 
    } 
Смежные вопросы