【问题标题】:Out of bounds exception (string)越界异常(字符串)
【发布时间】:2014-07-31 18:34:02
【问题描述】:

我正在为我的 Java 类开发一个项目,但似乎无法弄清楚如何解决这个问题。根据异常,我知道它在字符串索引长度内,但是,我似乎无法纠正这个问题。这是我第一次尝试学习Java,所以请原谅我的新手问题。

手头任务的一些背景知识:我正在尝试导入一个 ascii 艺术文件 (.txt),将其转换为 csv 格式,然后输出到指定的文件。方法签名由讲师提供,不能被篡改。这段代码可以编译,但是在运行时,会抛出一个引用我对imageToNumRep 的调用的越界异常。

这是我在这个特定部分的代码:

    import java.io.*;
    import java.util.*;

    public class Convert{
        public static void main(String[] args) throws FileNotFoundException {
            File input=new File("Flag.txt");
            File output=new File("result.txt");
            imageToNumRep(input, output);
        }

    public static void imageToNumRep(File input, File output) throws FileNotFoundException {
        Scanner in=new Scanner(input);
        PrintStream out= new PrintStream(output);
        int count=0; 
        while(in.hasNextLine()) {
            count++;
            String s=in.nextLine();
            out.print("(");
            for(int x=0; x < s.length()-1; x++) {
                int num=1;
                while(s.charAt(x)==s.charAt(x+1)) {
                    num++;
                }
                out.print(num+s.charAt(x-1));
                num=1;
                if(s.charAt(x) != s.charAt(x-1) && s.charAt(x) != s.charAt(x+1)) {
                    out.print("1,"+s.charAt(x));
                } else {
                    num=1;
                }
            }
            out.print(")");
            out.println();
        }
    }
} 

【问题讨论】:

  • 我们将需要查看堆栈跟踪以及抛出异常的哪一行。
  • 是的,就是这样。线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:Convert.main 的 Convert.imageToNumRep(Convert.java:24) 的 java.lang.String.charAt(String.java:658) 的 -1 (Convert.java:8)

标签: java string indexoutofboundsexception


【解决方案1】:

您正在从索引0 循环到s.length()-2s.length()-1 不会被包含,因为&lt; 运算符),如果您调用s.charAt(x+1),这将避免出现异常,但是当您这样做时

s.charAt(x-1)

x = 0,那么你会得到一个异常,因为它会像s.charAt(-1),这是无效的。

你能做什么? 可以从1开始迭代:

for(int x = 1; x < s.length() - 1; x++)

【讨论】:

  • -2 在哪里?我没有看到那条线。
  • 条件是x &lt; s.length()-1,所以s.length()-2是x的最后一个值。
  • 循环是for(int x = 0; x &lt; s.length() - 1; x++),所以x会从0变成s.length() - 2,因为&lt;,它会排除s.length() - 1
  • 哦,好的。抱歉,我在寻找编码逻辑而不是迭代。感谢您的指出和很好的收获。
  • 非常感谢,现在这很有意义。
【解决方案2】:

除了上一个答案,乍一看,

while(s.charAt(x)==s.charAt(x+1)) {
num++;
}

不应该终止,因为你没有改变 x 的值。但是,如果前两个连续字符不相等,您可能会很幸运。

【讨论】:

  • 将可能的情况编码为一系列 if/else 语句会更好吗?我是这么想的,但认为 while 语句也可以。
  • while 语句将在条件成立时继续循环它的主体,在这种情况下,由于条件不受主体影响,因此条件将始终成立或始终不成立,具体取决于x 和 s 在您到达它的点的值。如果没有更好地理解你试图通过这个块实现什么,我想你可能一直在寻找一个 if 语句?
  • 可能,让我尝试更好地解释其目的。我在 while 循环背后的想法只是计算我的 ascii 艺术文件每行中连续(如果有)字符的数量。如果当前扫描仪位置的char 值与前面的char 不匹配,则将绕过循环,我的计数器将保持在 1。
  • '计算我的 ascii 艺术文件每行中连续(如果有)字符的数量' 因此,我认为您需要做的是,将 while 更改为 if,并初始化 num = 1 在 for 循环之外,因为外部 while 循环针对每个“行”,否则您将丢失行的每个字符中的计数。
  • 非常感谢!你的想法完美地解决了我的问题。
猜你喜欢
  • 2019-08-01
  • 2013-12-08
  • 2014-10-16
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多