编译错误字符串无法解析为变量

时间:2018-02-21 07:59:09

标签: java string if-statement

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;
        }

    }
}

这也很好。我想知道那里有什么语法错误。

1 个答案:

答案 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的范围(您可能只是得到关于冗余变量的警告