【问题标题】:Java object access overwriting previous entriesJava 对象访问覆盖以前的条目
【发布时间】:2015-04-19 11:36:03
【问题描述】:

这里的第一个问题尝试。尝试一些关于括号记录的面试准备挑战 - 即:记录字符串的开括号和右括号位置。我尝试使用括号对象,然后在每个条目处使用具有打开和关闭位置的单个数组。条件似乎都被捕获了,但是数组只是将最后的结果复制到数组中的所有条目。知道我做错了什么吗?已经将打印留到屏幕上,以便我尝试调试它,并且知道到目前为止我只考虑我的算法的基本情况。提前致谢。

class ParanthesisMatch {

static final char leftBracket = '(';
static final char rightBracket = ')';

public static void main(String[] args) {

    String str = "(I (am (the) basic) case)";
    char[] input = str.toCharArray();

    int opens = 0;
    int closes = 0;
    int brackets = 0;

    Bracket[] bracketArray = new Bracket[10];

    System.out.println(input.length);

    for (int i = 0; i < input.length; i++) {
        System.out.println(input[i]);
        if (input[i] == leftBracket) {
            bracketArray[opens] = new Bracket();
            System.out.println("Open trigger: " + i);
            bracketArray[brackets].openBracket = i;
            System.out.println("Open bracket is: " + bracketArray[opens].openBracket);
            brackets++;
            opens++;
        }
        if (input[i] == rightBracket) {
            System.out.println("Close trigger: " + i);
            bracketArray[brackets - closes].closeBracket = i;
            System.out.println("Pos: " + (brackets - closes)
                    + "Close bracket is: " + bracketArray[brackets - closes].closeBracket);
            closes++;
        }
    }

    for (int i = 0; i < brackets; i++) {
        System.out.println("Bracket: " + i + " Open is " + bracketArray[i].openBracket + ", Close is " + bracketArray[i].closeBracket);
    }
}
}

class Bracket {

public static int openBracket;
public static int closeBracket;

Bracket() {
    openBracket = 0;
    closeBracket = 0;
}

public void setOpen(int open) {
    this.openBracket = open;
}

public void setClose(int close) {
    this.closeBracket = close;
}
}

更新 - 非常感谢你们。之后我发现了空指针异常错误,并且能够通过相同的更改来修复自己。静态提示对于我的对象遇到的许多问题非常有用!基本案例 ( ( ( ) ) ) 的工作代码,尚未嵌套 ( ( ) ( ) ) 是:

class ParanthesisMatch {

static final char leftBracket = '(';
static final char rightBracket = ')';

public static void main(String[] args) {

    String str = "(I (am (the) basic) case)";
    char[] input = str.toCharArray();
    System.out.println(input.length);

    int opens = 0;
    int closes = 0;
    int brackets = 0;

    Bracket[] bracketArray = new Bracket[10];

    for (int i = 0; i < input.length; i++) {
        if (input[i] == leftBracket) {
            bracketArray[opens] = new Bracket();
            bracketArray[brackets].setOpen(i);
            brackets++;
            opens++;
        }
        if (input[i] == rightBracket) {
            bracketArray[brackets - 1 - closes].setClose(i);
            closes++;
        }
    }
    System.out.println(input);
    for (int i = 0; i < brackets; i++) {
        System.out.println("Bracket: " + i + " Open is " + bracketArray[i].openBracket + ", Close is " + bracketArray[i].closeBracket);
    }
}
}
class Bracket {
public int openBracket;
public int closeBracket;
Bracket() {
    openBracket = 0;
    closeBracket = 0;
}
public void setOpen(int open) {
    this.openBracket = open;
}
public void setClose(int close) {
    this.closeBracket = close;
}
}

【问题讨论】:

    标签: java arrays object


    【解决方案1】:

    您的代码有两处错误。

    第一个问题在您的Bracket 类中:

    class Bracket {
    
        public static int openBracket;
        public static int closeBracket;
    

    您已将字段openBracketcloseBracket 声明为static,这意味着它们属于Bracket 类本身,而不是您创建的每个Bracket 对象。因此,每个字段只有一个副本,在 Bracket 类及其所有实例之间共享。这就解释了为什么最后每个Bracket 都显示相同的值。

    但是,这不是唯一的问题。去掉 static 修饰符,你会在这一行得到一个 NullPointerException

            bracketArray[brackets - closes].closeBracket = i;
    

    原因是您访问了数组中的错误条目。在它失败的时候,brackets 是 3,closes 是 0,但 bracketArray[3] 仍然是 null。您想访问索引 2 处的条目,因此在您使用它的所有三个位置将 brackets - closes 替换为 brackets - closes - 1

    brackets - closes替换为brackets - closes - 1后,我就可以成功运行你的代码了。

    对此我感到惊讶的是,从这两个字段中删除 static 修饰符后出现了 NullPointerException。我没有进行其他修改,如果我重新引入 static 修饰符,NullPointerException 就会消失。事实证明,即使您有 null 引用,您仍然可以调用 static 方法并访问 static 字段。例如,如果您在字段中重新引入 static 修饰符,则以下行将不会抛出 NullPointerException:

        System.out.println(((Bracket) null).openBracket);
    

    【讨论】:

      猜你喜欢
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 2020-11-27
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      相关资源
      最近更新 更多