Java:为什么这段代码不起作用?
有人能告诉我这个Java代码有什么问题吗?Java:为什么这段代码不起作用?,java,Java,有人能告诉我这个Java代码有什么问题吗? 此数组为:静态字符串[][]数据=新字符串[6][2]但是在这种情况下,数据[0][1]=“abcd”和数据[1][1]=“efgh”,剩余的数据[2-5][1]应该是空的。我只是想打印出非空的。在(j=2,k=3)处,代码在此之后不会执行。例如,“我在这里3”没有打印出来 int k=1; System.out.println("data[2][0]="+data[2][0]); for(int j=0; j<data.length;
此数组为:
静态字符串[][]数据=新字符串[6][2]
但是在这种情况下,数据[0][1]=“abcd”
和数据[1][1]=“efgh”
,剩余的数据[2-5][1]
应该是空的。我只是想打印出非空的。在(j=2,k=3)
处,代码在此之后不会执行。例如,“我在这里3”没有打印出来
int k=1;
System.out.println("data[2][0]="+data[2][0]);
for(int j=0; j<data.length; j++,k++) {
System.out.println("j="+j+" k="+k);
if (!(data[j][0].equals("null"))) {
System.out.println("I am here2");
sbissues = sbissues.append("\n");
sbissues = sbissues.append(k);
sbissues = sbissues.append(". ");
sbissues = sbissues.append(data[j][1]);
}
System.out.println("sbissues="+sbissues.toString());
System.out.println("I am here1");
}
System.out.println("I am here3");
问题是我从未达到“我在这里”的境界。
感谢大家的回答,他们都是正确的(使用!=null而不是.equals)。我猜我不能投票给你们所有人,我只被允许投票一次。我猜你们不希望它在为空时打印任何东西
将其用于if语句:
if (data[j][0] != null) {
在java中,复杂变量是对对象的引用。可以有两个变量指向同一个对象。当一个变量不指向任何东西时,它就是null。不能取消对空变量的引用,此时会出现NullPointerException
诸如int、long、byte等基本数据类型的行为不同。每次分配时,您都在复制数据。它们不能为空。首先,您只能在一个维度中迭代(同时使用j
和k
变量)。我猜您希望迭代数据结构的两个维度(因此,对于
循环,您几乎需要两个)。因此,我将从以下内容开始:
for (int j=0; j<data.length; j++) {
for (int k=0; k<data[j].length; k++) {
// ... here goes the printing
}
}
for(int j=0;j像其他人一样,我不确定你的代码试图做什么。但从我所能看出,我们应该修复一些错误。也许修复这些错误会使它达到你想要的效果
首先
if (!(data[j][0].equals("null"))) {
这应该是
if (data[j][0] != null) {
第二
在if检查中,您正在检查data[j][0]
是否为空。然后,在if块的最后一行,您正在使用data[j][1]
。我猜这些索引应该是相同的,而不是不同的?或者您想使用k
来索引
最后
每次迭代都在使用StringBuilder实例
方法不会刷新它的缓冲区。如果您希望输出不同的内容,请尝试在每个循环迭代结束时刷新SB实例。如果您打算附加到任何现有字符串,那么您就做对了。您应该得到一个NullPointerException
。您发布了所有输出吗?是吗运行程序时重定向stdout或stderr
OP评论
谢谢,这很有效!但是为什么?既然数据[j][0]是字符串类型,我不应该使用数据[j][0]。等于(null),而不是=
否,因为如果data[j][0]
为null
,尝试在其上调用equals()
将引发NullPointerException
。您无法访问不存在的对象的方法或字段
顺便说一下,这个NullPointerException
应该在您的输出中是可见的。您看到类似的内容了吗?首先,如果str==null
,那么
str.equals("null")
生成一个NullPointerException
。因此您可能需要更改
if (!(data[j][0].equals("null"))) {
进入
然后,给定初始化
data[2][0] = "hello";
data[2][1] = "world";
程序将打印(我删除了“我在这里”
s):
这是因为如果列0为非空,则仅向sbissues
追加内容
在上述分配中,您只为第1列设置了一个值,即矩阵中没有任何行会触发if语句。上述代码的预期结果是什么?是否有任何错误?如果您得到输出,我看不到任何错误,您试图做什么?…以及数据
是如何定义的?(或其内容是什么)是的,我看不出它有什么问题,它的行为和我预期的完全一样。这个数组是:静态字符串[][]数据=新字符串[6][2];但是在这种情况下,数据[0][1]=“abcd”和数据[1][1]=“efgh”,剩余的应该是空的。我只是试图打印出非空的。At(j=2,k=3),代码在那之后就不会执行了。起初我没有看到它,但OP在j的for循环中增加了k。我首先认为他想做你所说的,但后来我看了k的用法,似乎它们不打算成为他的数据数组的二级索引,它更像是一个基于1的计数器。虽然k
似乎是毫无用处,数组的维数似乎为[n][2]。它看起来数组中的每个元素都是一个键值对。是的,我看到k
总是j+1
,但我想这不是OP的意图。我想我们永远也不会知道。谢谢,这很有效!但是为什么?既然数据[j][0]是字符串类型,我不应该使用数据[j][0]。等于(null),而不是!=null
没有equals()
方法。null
不是对象
或什么的。它根本什么都不是。任何使用句点操作符
访问/调用它的尝试都只会导致NullPointerException
(异常名称现在对您有更合理的意义吗?)嗨,埃里克森,不,我没有在控制台上看到NullPointerException,只有我所有的打印语句。这是Eclipse上的Junit测试。@难住了-如果您在Junit窗格中单击失败的测试,您应该能够看到NullPointerException
堆栈跟踪。(我认为;我使用TestNG,但我认为它们的UI是相似的。)
if (data[j][0] != null) {
data[2][0] = "hello";
data[2][1] = "world";
data[2][0]=hello
j=0 k=1
sbissues=
j=1 k=2
sbissues=
j=2 k=3
sbissues=
3. world
j=3 k=4
sbissues=
3. world <----
j=4 k=5
sbissues=
3. world
j=5 k=6
sbissues=
3. world
data[0][1]="abcd"
data[1][1]="efgh"
^ both values put in column 1 (will not affect the data[j][0] check!)