Java 获取相反的数字或获取IndexOutOfBoundException

Java 获取相反的数字或获取IndexOutOfBoundException,java,Java,当字符串布局如下所示时: String layout = "b....\n"+ ".....\n"+ "....b\n"+ ""; 然后我的代码读取的行数和列数完全错误。对于行号,它向我显示列号,反之亦然。对于上面的示例,行数为3,列数为5。但当测试一些示例和/或相反的数字而不是行数时,我得到了indexOutOfBoundsException,它显示的是列数,而不是列数。smb可以看看代码的逻辑吗 public static Shape mak

当字符串布局如下所示时:

String layout =
      "b....\n"+
      ".....\n"+
      "....b\n"+
      "";
然后我的代码读取的行数和列数完全错误。对于行号,它向我显示列号,反之亦然。对于上面的示例,行数为3,列数为5。但当测试一些示例和/或相反的数字而不是行数时,我得到了indexOutOfBoundsException,它显示的是列数,而不是列数。smb可以看看代码的逻辑吗

public static Shape makeShape(String layout,char displayChar)
  {
      Shape passLayout;
      int rows = 0;
      int cols = 0;
      String line = "";
      String firstLine = "";
      String lastLine = "";
      Scanner data = new Scanner(layout);
      firstLine = data.nextLine();

      while(data.hasNextLine())
      {
          line = data.nextLine();
          cols = line.length();
          rows++;
      }
      //line = data.nextLine();
      lastLine = line;
      if((firstLine.charAt(0) == '.' && lastLine.charAt(0) == '.') || 
              (firstLine.charAt(cols) == '.' && lastLine.charAt(cols) == '.'))
          throw new FitItException("OOPS! Empty borders!");
      else 
          passLayout = new CreateShape(rows, cols, displayChar, layout);

      return passLayout;

注意:条件if语句检查空字符“.”,即形状的布局字符串必须在第0行、第0列、最后一行和最后一列中至少有一个填充块

我不知道代码会在哪里混合行和列的值,但我确实看到了indexOutOfBoundsException的可能原因。尝试更改您的if语句:

if((firstLine.charAt(0) == '.' && lastLine.charAt(0) == '.') || 
          (firstLine.charAt(cols-1) == '.' && lastLine.charAt(cols-1) == '.'))
      throw new FitItException("OOPS! Empty borders!");

由于基于0的索引,最后一个字符的位置将始终比列数少一个。

在调用lastLine.charAt0之前添加额外的检查lastLine.length>0