public class StrTest {
public static void main(String[] args) {
int i = 10;
Object obj =i;
if(obj instanceof String)
String s=(String) obj;
}
}
给我错误"字符串无法解析为变量"但是如果将程序更改为
public class StrTest {
public static void main(String[] args) {
int i = 10;
Object obj =i;
String s=null;
if(obj instanceof String)
s=(String) obj;
}
}
如果我做这样的事情,这会编译得很好:
public class StrTest {
public static void main(String[] args) {
int i = 10;
Object obj =i;
if(obj instanceof String){
String s=(String) obj;
}
}
}
这也很好。我想知道那里有什么语法错误。
答案 0 :(得分:3)
我无法复制" String无法解析为变量"错误,你的代码给我的是这个编译错误,所以我将重点关注它:
StrTest.java:7: error: variable declaration not allowed here
String s=(String) obj;
在Java中
if(obj instanceof String)
String s=(String) obj;
类似于
if(obj instanceof String) {
String s=(String) obj;
}
变量的范围仅限于声明的代码块{..}
。这意味着我们无法在该块之外的任何位置使用s
变量。拥有变量的主要原因是能够在不同的地方使用它们的值,例如int x = readSomeData(); int y = 2*x;
。但是因为我们没有在其他任何地方使用该变量,编译器将其视为不必要的代码(可能由一些误解造成),所以它试图阻止我们通过给出错误来编写它。
BTW Andy Turner pointed out in his comment技术上可以在同一行中使用 s
,例如
public static String someMethod(String a, String b){return a+b;}
...
if(obj instanceof String)
String s = someMethod(s = "foo", s);
// we are "using" value of s here ---^
但编译器更关注事实
if(obj instanceof String)
String s = ...;
//we still CAN'T use "s" variable *after* that line
其他案件的问题已解决
String s=null;
if(obj instanceof String)
s=(String) obj;
或
Object obj =i;
if(obj instanceof String){
String s=(String) obj;
}
因为在s
方法中obj
/ main
声明了 ,所以这些变量在if
部分之后也可用,只有为他们分配新值。
顺便说一句,你可以明确写出{
.. }
if(obj instanceof String) {
String s=(String) obj;
}
并且这样的代码将编译,因为编译器假设您知道s
的范围(您可能只是得到关于冗余变量的警告)