我是java的新手,我遇到了一个对我没有意义的问题。 我有一个列表视图,启动一个活动,活动必须阅读 一些意图值,以显示正确的信息。
// getting intent data
Intent in = getIntent();
// Get name
final String catName = in.getStringExtra("category").toString();
//Textview
TextView categorytw= (TextView)findViewById(R.id.category_name);
categorytw.setText(catName);
// Category URL
String catUrl = "";
if( catName =="Italy" ){
catUrl = "http://url .com/italy.php";
}
else if( catName =="Belgium"){
catUrl = "http://url .com/italy.php";
}
else if( catName =="France"){
catUrl = "http://url .com/france.php";
}
正如您所见,我得到了意图值"类别"并将其分配给 catName 变量,然后更新标题textview categorytw
到目前为止一切都很好,categorytw根据catName的值更新。
现在我需要根据类别名称获取特定网址,这就是原因 我初始化 catUrl ,它在开头是空的。 根据 catName 的值,catUrl将具有不同的值。
当我从url(catUrl)获取一些数据时,稍后会使用此值/ url:
try{
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(catUrl );
}
问题是catUrl
总是空的。
我仔细检查了catName值。
有人知道这里可能有什么问题吗?
答案 0 :(得分:6)
==
通过引用比较字符串(即指向内存中相同位置的变量),而不是值。使用catName.equals("Italy")
按值进行比较。
答案 1 :(得分:0)
使用.equals
来比较字符串,而不是==
。
==
比较引用相等性。
.equals
比较值相等。
在你的情况下,"意大利","比利时","法国"和catName指向不同的对象。没有任何条件匹配。因此,catUrl
始终为空。
更新您的代码,如下所示:
if( "Italy".equals(catName)){
catUrl = "http://url.com/italy.php"; ## Remove the space between url and .com
}
else if("Belgium".equals(catName)){
catUrl = "http://url.com/italy.php";
}
else if( "France".equals(catName)){
catUrl = "http://url.com/france.php";
}
答案 2 :(得分:0)
字符串不能像java中的原始变量那样进行比较。原因是==
仅比较引用。因此,如果您检查if (1 == 1)
,则会将其评估为true,因为jvm会重用基元而不是为其分配新内存。
字符串工作不同。在Java中,字符串不是原始变量,这就是为什么每次编写"this is a string"
时,都会生成一个新对象,并在内存中分配空间,尽管引号中的文本相同。如果你愿意,你可以把它想象成new String(// all the characters of a string)
之类的东西。
这是为了你必须使用"some string".equals("another string")
来比较字符串。使用equals
进行检查不仅会比较参考。它检查对象是否具有相同的值,这就是为什么这样做的原因。
所以正确的方法是:
if( catName.equals("Italy") ){
catUrl = "http://url .com/italy.php";
}
答案 3 :(得分:0)
==表示它将内存地址与其他对象进行比较。在你的代码片段中,当你调用toString()时,它将从堆中生成一个新的String对象作为返回。 if-else语句中的逻辑它使用来自常量池的String与堆对象中的不同。您应该使用equals()来比较字符串值,有关详细信息,请参阅JDK源代码。
答案 4 :(得分:0)
将catUrl声明为StringBuilder,使用StringBuilder.append()为其添加新值。