感谢您抽出宝贵时间帮助我了解此代码的错误并对其进行故障排除。 我没有找人为我这样做 ,我只想了解有什么问题,如果您对我的代码有任何建议请随意如果你向我解释,只能制作它们。我无法提交我不理解的代码。
我遇到了超出异常的问题。以下是作业的简要概要。然后我将发布驱动程序,类(我的代码)和输出文件示例(根据分配,我们需要使用驱动程序而不更改初始代码。)
此外,如果此教程解决了以防止其他人在将来的作业中直接使用它(复制/粘贴),如果此教师或其他人决定执行此项目,我将静音大部分代码
创建乌龟时,请务必将其放在房间中间,笔朝下,朝右。可以在同一个房间同时放置多只乌龟。将房间初始化为空白,并始终跟踪每只海龟,它的位置和方向,以及它的笔状态。
班级(我的代码)
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.drawSpiral(TurtleDriver.java:41)at TurtleDriver.main(TurtleDriver.java:20)
根据作业,大小为40x20。由于匹配数组而非传统图形,高度/宽度和x / y不符合预期。根据教师的要求,虽然我可以根据需要翻转它们。输出应该在控制台和输出文件中看起来像这样。 outfile尚未实现。
******
* *
* *
* *
* *
* *
* *
******
+++++++++ ########
+ #
+ ++++++ # ######
+ + + # # #
+ + ++ + # # ## #
+ + + + # # # #
+ ++++ + # #### #
+ + # #
++++++++ ########
下面是第20行
drawSpiral(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更新
我已删除了大部分代码,以防止此代码在我大学的这个或其他教师的相同或类似项目中使用。如果您希望看到此代码与您的学校项目无关,或者您希望获得有关此任务的帮助,请直接在此页面或我的帐户上向我发送消息。我非常愿意帮助和存储我的所有文件。
答案 0 :(得分:0)
在forward
功能中,您不会检查Room[xPos][yPos]
是否仍在Room[height][width]
范围内。您需要检查xPos
是否小于height
,yPos
是否小于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
不同的内容。它令人困惑并可能导致错误。