Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 臭名昭著的对象错误_Java - Fatal编程技术网

Java 臭名昭著的对象错误

Java 臭名昭著的对象错误,java,Java,我在使用netbeans时发现了我认为是一个bug。当我调用我的方法对一个包含名称的数组(ob.sort)按字母顺序排序时,它会自动对另一个包含原始名称的数组进行排序,因为在数组开头填充了输入(ob.input)之后,原始名称没有分配给任何对象。 我在编写大型程序时遇到过这个问题(不止一次),但我制作了一个更简单的程序来演示这个问题。它看起来就像我复制了类方法,并将其粘贴到了主类下面,使您更容易跟踪程序中的变量 public static void main(String args[]){

我在使用netbeans时发现了我认为是一个bug。当我调用我的方法对一个包含名称的数组(ob.sort)按字母顺序排序时,它会自动对另一个包含原始名称的数组进行排序,因为在数组开头填充了输入(ob.input)之后,原始名称没有分配给任何对象。 我在编写大型程序时遇到过这个问题(不止一次),但我制作了一个更简单的程序来演示这个问题。它看起来就像我复制了类方法,并将其粘贴到了主类下面,使您更容易跟踪程序中的变量

public static void main(String args[]){
    ObjectTest ob = new ObjectTest();
    ob.input();
    String x[] = ob.getNames();
    System.out.println(x[0]);
    ob = new ObjectTest(x);
    System.out.println(x[0]);
    ob.sort();
    System.out.println(x[0]);
    String y[] = ob.getNamesrt();
    System.out.println(x[0]);

}
}
    /*import java.io.*;
import javax.swing.*;
public class ObjectTest {
String name[];
String namesrt[];

public ObjectTest(){
    name = new String[3];
    namesrt = new String[3];
}

public ObjectTest(String j[]){
    namesrt = j;
}

public void input(){
    for(int i = 0; i < name.length; i++){
        name[i] = JOptionPane.showInputDialog("Enter name");
    }
}

public void sort(){
    if(!(namesrt == null)){
    for(int i = 0; i < namesrt.length; i++){
        for(int c = i + 1; c < namesrt.length; c++){
            if(namesrt[i].compareToIgnoreCase(namesrt[c]) > 0){
                String n = namesrt[i];
                namesrt[i] = namesrt[c];
                namesrt[c] = n;
            }
        }
    }
    }
    else{JOptionPane.showMessageDialog(null,"Names not received");}
}

public String[] getNames(){
    return name;
}

public String[] getNamesrt(){
    return namesrt;
}

public void setNames(String j[]){
    name = j;
}

public void setNamesrt(String j[]){
      namesrt = j;
}
}*/
publicstaticvoidmain(字符串参数[]){
ObjectTest ob=新的ObjectTest();
ob.input();
字符串x[]=ob.getNames();
System.out.println(x[0]);
ob=新对象测试(x);
System.out.println(x[0]);
ob.sort();
System.out.println(x[0]);
字符串y[]=ob.getNamesrt();
System.out.println(x[0]);
}
}
/*导入java.io.*;
导入javax.swing.*;
公共类对象测试{
字符串名[];
字符串namestr[];
公共对象测试(){
名称=新字符串[3];
namesrt=新字符串[3];
}
公共对象测试(字符串j[]{
namestr=j;
}
公共无效输入(){
for(int i=0;i0{
字符串n=namestr[i];
namestr[i]=namestr[c];
namestr[c]=n;
}
}
}
}
else{JOptionPane.showMessageDialog(null,“未收到名称”);}
}
公共字符串[]getNames(){
返回名称;
}
公共字符串[]getNamesrt(){
返回namestr;
}
公共void集合名(字符串j[]){
name=j;
}
public void setNamesrt(字符串j[]{
namestr=j;
}
}*/
我在使用netbeans时发现了我认为是一个bug

嗯,这可能是代码中的一个bug。这在Java或Netbeans中不是一个bug。它只是演示了数组在Java中是引用类型的事实,以及对象的工作方式

下面是一个简短但完整的程序,演示了相同的效果:

public class Test {
    public static void main(String[] args) {
        String[] x = { "hello" };
        // Copy the *reference*
        String[] y = x;
        System.out.println(y[0]); // Prints "hello"
        x[0] = "new value";
        System.out.println(y[0]); // Prints "new value"
    }
}
此处
x
y
的值是对同一数组对象的引用。。。因此,如果数组是“通过”
x
更改的,则该更改仍然可见为
y[0]

如果要使代码创建独立对象,则需要更改以下内容:

public ObjectTest(String j[]){
    namesrt = j;
}
致:


(理想情况下,将其更改为将参数声明为
String[]j
,或者更好地修复所有变量名,使其更有意义,但这是另一回事。)

这里有一个有用的链接。读一读,它很酷。请提供一个简短但完整的程序来说明问题。适当缩进,不要注释掉大部分内容。除非你认为这个问题是GUI特有的,否则你不应该需要GUI来演示它-硬编码数据。好吧……看起来你在类中传递/使用的是同一个数组,如果你对一个数组排序,它将在另一个数组上可见。我没有时间正式地跟踪它,但请注意数组是可变的(关于这个问题,什么是“臭名昭著的”?)
public ObjectTest(String j[]){
    namesrt = j.clone();
}