Java &引用;找不到符号:变量";尽管声明了变量

Java &引用;找不到符号:变量";尽管声明了变量,java,Java,当我编译下面的代码时,它说: “错误:找不到符号:变量最大值” 但是我确实定义了变量max public class Solution { public static boolean isOneEditDistance(String s, String t) { if (s.length() >= t.length() ) { StringBuilder a = new StringBuilder (s);

当我编译下面的代码时,它说:

“错误:找不到符号:变量最大值”

但是我确实定义了变量
max

public class Solution {
    public static  boolean isOneEditDistance(String s, String t) {
            if (s.length() >= t.length() ) {
                    StringBuilder a = new StringBuilder (s);
                    StringBuilder b = new StringBuilder (t);
                    int max = s.length();
                    int min = t.length();
            }
            else {
                    StringBuilder a = new StringBuilder (t);
                    StringBuilder b = new StringBuilder (s);
                    int max = t.length();
                    int min = s.length();
            }

            int flag = 0;

            if ( (max-min)>1 )
                    return flase;
            else if ( (max-min)==1 ) {
                .....

变量/参数的范围不正确:

如果参数在{}范围内,则范围仅限于这些{}

因此,请将代码更改为此,以更改范围并解决问题:

public class Solution {
public static  boolean isOneEditDistance(String s, String t) {
int max=0;
int min=0;
        if (s.length() >= t.length() ) {
                StringBuilder a = new StringBuilder (s);
                StringBuilder b = new StringBuilder (t);
                max = s.length();
                min = t.length();
        }
        else {
                StringBuilder a = new StringBuilder (t);
                StringBuilder b = new StringBuilder (s);
                max = t.length();
                min = s.length();
        }

        int flag = 0;

        if ( (max-min)>1 )
                return flase;
        else if ( (max-min)==1 ) {

我更喜欢如下所示的代码,这也避免了由于a和b在if语句中包含的块中的作用域而引起的问题

 if( s.length() < t.length() ){
     String h = s; s = t; t = h;
 }
 // now s is not shorter than t
 int max = s.length();
 int min = t.length();
 StringBuilder a = new StringBuilder(s);
 StringBuilder b = new StringBuilder(t);
if(s.length()
无法查看变量的原因是由于变量的范围。变量可以“深入”可见性链,但不能“挖掘”。因为变量是在
if statement
中声明的,所以变量只能在该
if语句中可见,因为它不能“挖掘”

以下是我出色的MS绘画技巧,它拙劣地描述了我无法“挖掘”范围外可见性的含义:


变量已在
if(s.length()>=t.length())
块中初始化。因此,这些变量仅限于此


解决方案:在条件出现之前对其进行初始化。

看到这张图片,我会说您的名字选择得很好;-)抱歉,无法抗拒:)@ErickG.Hagstrom-Oops。令人惊讶的是,8个月前没有人注意到这一点。谢谢!:)一般问题的一个具体案例是的,特别是关于“变量声明可能超出范围”的部分。如果使用Math.abs()“在条件之前声明它们”,而不是“在条件之前初始化它们”,则可以避免整个混乱。这不是初始化问题;编译器无法识别它们已被声明。