机械龟“图形”,出界异常

时间:2014-04-20 03:46:50

标签: java arrays class 2d turtle-graphics

感谢您抽出宝贵时间帮助我了解此代码的错误并对其进行故障排除。 我没有找人为我这样做 ,我只想了解有什么问题,如果您对我的代码有任何建议请随意如果你向我解释,只能制作它们。我无法提交我不理解的代码。

我遇到了超出异常的问题。以下是作业的简要概要。然后我将发布驱动程序,类(我的代码)和输出文件示例(根据分配,我们需要使用驱动程序而不更改初始代码。)

此外,如果此教程解决了以防止其他人在将来的作业中直接使用它(复制/粘贴),如果此教师或其他人决定执行此项目,我将静音大部分代码

  
    

创建乌龟时,请务必将其放在房间中间,笔朝下,朝右。可以在同一个房间同时放置多只乌龟。将房间初始化为空白,并始终跟踪每只海龟,它的位置和方向,以及它的笔状态。

  

班级(我的代码)

class Turtle {

    boolean penStatus;      //pen status true = down, false = up
    int xPos, yPos;         //x position and y position of turtle (x = height,         y = width)
    static String Room[][];     //sets room size via 2d array (static string array)
    String Turtle;          //determines turtle output marker
    int Direction;          //0 = north, 1= east, 2= south, 3= west
    static int height;
    static int width;

    /*
     Precondition:  accepts int height and int width
     Postcondition: returns void

     Constructor for The array"Room" when initializeRoom is called, sets all fields to blank
     */
    public static void initializeRoom(int h, int w){
        String emptyStr = "";
        height = h;
        width = w;
        Room = new String[height][width];
        for(int i = 0; i < height; i++){
            for(int j = 0; j < width; j++){
                Room[i][j] = emptyStr;
            }
        }
    }
//
//all code between here is redacted to prevent use on similar assignment
//  
    public static void draw(PrintStream input){
        if(input.equals(System.out)){
            for(int i = 0; i < height; i++){
                for(int j = 0; j < width; j++){
                    System.out.println(Room[i][j]);
                }
            }
        }
    }

}

此处的驱动程序用于演示输入和所有动作。

public class TurtleDriver {

   public static void main(String[] args) throws FileNotFoundException {

      PrintStream out1 = new PrintStream(new File("turtle.txt"));
      PrintStream out2 = System.out;

      Turtle.initializeRoom(40, 20);
      Turtle myt1 = new Turtle('+');
      Turtle myt2 = new Turtle('#');
      Turtle myt3 = new Turtle('*');

      //
      //driver information redacted to prevent use on this assignment in the future
      //

以及下面列出的编译错误。基本上我看到它超出了界限。但是我很难编辑这段代码以弄清楚它是如何移动的,主要是因为我无法获得任何输出因为它失败了。所以一些帮助将不胜感激。

  

线程中的异常&#34; main&#34; java.lang.ArrayIndexOutOfBoundsException:   20在Turtle.forward(Turtle.java:131)at   TurtleDriver.drawSpir​​al(TurtleDriver.java:41)at   TurtleDriver.main(TurtleDriver.java:20)

根据作业,大小为40x20。由于匹配数组而非传统图形,高度/宽度和x / y不符合预期。根据教师的要求,虽然我可以根据需要翻转它们。输出应该在控制台和输出文件中看起来像这样。 outfile尚未实现。

     ******         
     *    *         
     *    *         
     *    *         
     *    *         
     *    *         
     *    *         
     ******         





 +++++++++ ######## 
 +         #        
 + ++++++  # ###### 
 + +    +  # #    # 
 + + ++ +  # # ## # 
 + +  + +  # #  # # 
 + ++++ +  # #### # 
 +      +  #      # 
 ++++++++  ######## 

下面是第20行
        drawSpir​​al(MYT1);

以下是第20行调用的方法

   public static void drawSpiral(Turtle myT) {
      for(int i = 1; i < 10; i++) {
         myT.forward(i);
         myT.right();
      }
   }  

此代码在运行螺旋方法后被标记为导致越界。从驱动程序运行螺旋方法,下面的代码是来自Turtle类的第131行。

if(Direction == 1){         
        yPos = yPos + number;
        if(penStatus == true){
            for(int i = number; 0 < number; i--){
                Room[xPos][(yPos-i)] = Turtle;
            }
        }           

更新截至2014年4月19日10:14

我忽略了for循环没有检查是否&#34;我&#34;大于零,但如果数字是。所以代码运行直到超出范围,就像一个无限循环。我得到它打印一些东西到控制台与类代码中的直接打印。下面是我更新的片段。

if(penStatus == true){
                for(int i = number; 0 < i; i--){

于2014年4月23日上午12:30更新

我已删除了大部分代码,以防止此代码在我大学的这个或其他教师的相同或类似项目中使用。如果您希望看到此代码与您的学校项目无关,或者您希望获得有关此任务的帮助,请直接在此页面或我的帐户上向我发送消息。我非常愿意帮助和存储我的所有文件。

1 个答案:

答案 0 :(得分:0)

forward功能中,您不会检查Room[xPos][yPos]是否仍在Room[height][width]范围内。您需要检查xPos是否小于heightyPos是否小于width,且两者都大于或等于零。

我建议将其更改为:

if(Direction == 1) {
    int i = 0;
    if (yPos + number >= width) {
        yPos = width-1;
        i = width-1 - yPos;
    } else {
        yPos = yPos + number;
        i = number;
    }
    if(penStatus == true){
        for(; i > 0; i--){
            Room[xPos][(yPos-i)] = Turtle;
        }
    }
}

您还需要为其他每个方向添加类似的条件。

我还建议将String Turtle重命名为与class Turtle不同的内容。它令人困惑并可能导致错误。