2012-11-22 113 views
1

虽然我正在做一个简单的密码程序。我遇到这个错误获取java.lang.StringIndexOutOfBoundsException错误

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
at java.lang.String.charAt(Unknown Source) 
at Caesar.main(Caesar.java:27) 

好吧,我不是很清楚什么原因。我需要一些资深人士的帮助@@下面是我的代码。

import java.util.Scanner; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.PrintWriter; 

public class Caesar { 

    public static void main(String[] args){ 
     String from = "abcdefghijklmnopqrstuvwxyz"; 
     String to = "feathrzyxwvusqponmlkjigdcb"; 
      Scanner console = new Scanner(System.in); 
      System.out.print("Input file: "); 
      String inputFileName = console.next(); 
      System.out.print("Output file: "); 
     String outputFileName = console.next(); 

     try{ 
      FileReader reader = new FileReader("C:/"+inputFileName+".txt"); 
      Scanner in = new Scanner(reader); 
      PrintWriter out = new PrintWriter("C:/"+outputFileName+".txt"); 

       while (in.hasNextLine()){ 
        String line = in.nextLine(); 
        String outPutText = ""; 
        for (int i = 0; i < line.length(); i++){ 
         char c = to.charAt(from.indexOf(line.charAt(i))); 
         outPutText += c; 
        } 
        System.out.println("Plaintext: " + line); 
        System.out.println("Ciphertext: " + outPutText); 
        out.println(outPutText);   
       } 
       System.out.println("Processing file complete"); 
       out.close(); 
     } 
     catch (IOException exception){ 
      System.out.println("Error processing file:" + exception); 
     } 
} 
} 
+0

这不是一个密码;) – LanguagesNamedAfterCofee

+0

“StringIndexOutOfBounds”,令人惊讶的,这意味着你使用的索引对一个无效的字符串操作(在本例中显然是'charAt')。该消息甚至会告诉你什么是无效索引:-1。将复杂的陈述分解为更简单的部分将允许您使用调试器或简单的System.out.println语句检查中间结果,并为您自己解决问题。 –

回答

6

这是你的任务你for loop内: -

char c = to.charAt(from.indexOf(line.charAt(i))); 

在这里,indexOf回报-1from字符串没有找到char,然后它会抛出一个StringIndexOutOfBoundsException

您可以获取字符前添加一个检查: -

int index = from.indexOf(line.charAt(i)); 

if (index >= 0) { 
    char c = to.charAt(index); 
    outPutText += c; 
} 

或: -

char ch = line.charAt(i); 

if (from.contains(ch)) { 
    char c = to.charAt(from.indexOf(ch)); 
    outPutText += c; 
} 
+2

@ shuffle1990 ..不客气:)很高兴你学到了一些东西。这就是犯错的全部要点。干杯:) –

3

如果在字符串中找不到字符,indexOf()返回-1。所以,你需要为此发生一些偶然事件。当在“from”中找不到该字符时,您希望代码执行什么操作?