【问题标题】:Java Object Creating issueJava对象创建问题
【发布时间】:2015-03-06 21:56:22
【问题描述】:

我正在尝试将“A”字符串传递给构造函数。我遇到的问题是必须设置的实例变量没有填充任何东西。现在我正在尝试一些与往常不同的东西。一旦我尝试使用数组变量进行任何操作,它就会给出 NPE。那么如何解决这个问题并在未来避免它。谢谢!

public Array(String x){
        if(x == "A" ){
            array = { { 1, 1 }, { 1, 1 }, { 1, 1 } };
        }
        if(x == "B"){
            array = { { 2, 2 }, { 2, 2 }, { 2, 2 } }; 
        } 
        if(x == "C"){
            array = { { 3, 3 }, { 3, 3 }, { 3, 3 } };
        }
    }

【问题讨论】:

  • 使用String.Equals 而不是==
  • 你能在调用构造函数的地方显示使用吗?你从哪里得到例外?它的 Stacktrace 是什么?
  • 你能把整个课程代码贴出来吗?我觉得很奇怪你将类命名为 Array
  • 我一尝试获取“数组”的长度就得到了异常,它被称为数组,因为我在一个单独的类中测试它,我使用它的类包括一个 ui 但是我不想每次更改时都打开用户界面

标签: java arrays object constructor instance-variables


【解决方案1】:

array 可能永远是null。有两个原因...

首先,比较逻辑不正确。不要使用== 比较字符串,use String.equals instead

第二,逻辑没有默认条件。如果不满足任何条件会发生什么? array 永远不会被初始化。添加默认值:

if(x.equals("A") ){
    array = { { 1, 1 }, { 1, 1 }, { 1, 1 } };
} else if(x.equals("B")){
    array = { { 2, 2 }, { 2, 2 }, { 2, 2 } }; 
} else if(x.equals("C")){
    array = { { 3, 3 }, { 3, 3 }, { 3, 3 } };
} else {
    // set array to a default value?
    // throw an exception?
    // something else?
}

(注意:我不能肯定地说,从构造函数中抛出异常在 Java 中是好还是坏的做法。很容易有关于 JVM 如何处理我不熟悉的问题的细节。如果这是不好的做法,那么工厂方法而不是构造函数可能是解决这个问题的好方法。)

【讨论】:

  • 完全忘记了 String.equals。将添加一个默认条件。现在唯一发生的事情就是这样说:“数组常量只能在实例化器中使用。”
  • @Marciano:这对我来说是新的,但公平地说,我对 Java 做的不多。基于该错误,也许解决该问题的一种方法是将这些硬编码的数组常量设置为常量(或某种类型的私有最终类成员),并在此方法中引用它们,而不是在-此方法中的行。
  • 我已经尝试过了,但这也没有减少它。我只是想避免将数组输入到构造函数本身的麻烦,但是看到这种方法不起作用,我正在寻找替代方法
【解决方案2】:
public ArrayWrapper(String x){ //"Array" is a confusing name for a class
    if(x == null) {
        System.err.println("x is null! Please instantiate x before calling Array().");
        return;
    }
    //...
}

【讨论】:

  • 绝对不是问题,尽管空检查是有意义的。
  • @carlspring 在这种情况下不是。 OP 仅使用该字符串进行比较。因此null 不会破坏任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多