如何避免“局部变量可能尚未初始化"? [英] How to avoid 'the local variable may not have been initialized'?

查看:40
本文介绍了如何避免“局部变量可能尚未初始化"?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

/*这是一个根据您选择的功能/选项计算互联网广告费率的程序.***/导入 java.util.Scanner;公共课互联网广告{public static void main(String[] args){扫描仪输入 = new Scanner(System.in);int numberOfWords;//我按照 Eclipse 的建议为两者分配了 0 个值浮动文本成本 = 0;浮动链接成本 = 0;浮动图形成本;//<=25 个字是每字 .40 美元的固定费用加上 3.00 美元的基本费用最终浮动 TEXT_FLAT_FEE = 0.40F;最终浮动 TEXT_BASE_FEE = 3.00F;//<=35 个词是前 25 个词的 $.40 和//每字额外 .35 美元,最多(包括 35 个字)加上 3.00 美元的基本费用最终浮动 LESS_OR_EQUAL_THAN_THIRTYFIVE = 0.35F;//超过 35 个字是每字 0.32 美元的固定费用,没有基本费用最终浮动 MORE_THAN_THIRTYFIVE = 0.32F;System.out.println("欢迎光临!");System.out.print("请输入广告中的字数:");numberOfWords = in.nextInt();if (numberOfWords <= 25){textCost = TEXT_BASE_FEE + (TEXT_FLAT_FEE * numberOfWords);}否则 if (numberOfWords <= 35){textCost = TEXT_BASE_FEE + (TEXT_FLAT_FEE * 25) + (numberOfWords - 25) * LESS_OR_EQUAL_THAN_THIRTYFIVE;}else if (numberOfWords > 35){textCost = numberOfWords * MORE_THAN_THIRTYFIVE;}字符串 addLink,AdvancePay;字符链接,advPay;最终浮动 LINK_FLAT_FEE = 14.95F;最终浮动 THREE_MONTH_ADV_DISCOUNT = 0.10F;System.out.print("你要添加一个链接吗(y = yes or n = no)?");addLink = in.next();链接 = addLink.charAt(0);链接 = Character.toLowerCase(link);如果(链接=='y'){System.out.print("你愿意提前三个月付款吗" + "(y = yes or n = no)?");AdvancePay = in.next();advPay = AdvancePay.charAt(0);advPay = Character.toLowerCase(advPay);开关 (advPay){案例'y':链接成本 = (3 * LINK_FLAT_FEE) - (3 * LINK_FLAT_FEE) * THREE_MONTH_ADV_DISCOUNT;休息;案例n":链接成本 = LINK_FLAT_FEE;休息;}}别的{链接成本 = 0;}字符串 addGraphic;字符图形;System.out.print("您要添加图形/图片吗" + "(S = 小,M = 中,L = 大或 N = 无)?");addGraphic = in.next();图形 = addGraphic.charAt(0);图形 = Character.toUpperCase(图形);图形 = Character.toLowerCase(graphic);开关(图形){案例's':图形成本 = 19.07F;休息;案例'm':图形成本 = 24.76F;休息;案例'l':图形成本 = 29.33F;休息;默认:图形成本 = 0;}浮动gst,totalBeforeGst,totalAfterGst;最终浮动 GST_RATE = 0.05F;totalBeforeGst = textCost + linkCost + graphicsCost;//textCost &linkCost 不会初始化gst = totalBeforeGst * GST_RATE;totalAfterGst = totalBeforeGst + (totalBeforeGst * GST_RATE);System.out.printf("		%-16s %11s
", "类别", "成本");System.out.printf("		%-16s %11.2f
", "Text", textCost);//linkCost 不会初始化System.out.printf("		%-16s %11.2f
", "Link", linkCost);//textCost 不会初始化System.out.printf("		%-16s %11.2f
", "Graphic", graphicsCost);System.out.printf("		%-16s %11.2f
", "Total", totalBeforeGst);System.out.printf("		%-16s %11.2f
", "GST", gst);System.out.printf("		%-16s %11.2f
", "Total with GST", totalAfterGst);}}

我几乎完成了这段代码,Eclipse 建议我将 0 值分配给 textCostlinkCost.有没有其他方法可以解决这个问题.如果我不分配 0 值,它们会出错(局部变量 XXX 可能尚未初始化).有人可以向我解释为什么会发生这种情况,即使我用方程分配了两个变量?

谢谢.

我按照建议进行操作,并仅在需要时才声明变量.我还添加了一些评论.

解决方案

在深入研究代码之前的三个建议:

  • 尽可能晚地声明变量,以便于理解代码.
  • 重构这个巨大的方法 - 目前它非常庞大.
  • 使常量static final 字段.它们与对方法的任何特定调用无关,因此它们不应是局部变量.

现在就实际问题而言,最简单的方法是确保每个可能的流实际上确实赋值或抛出异常.因此,对于 textCost,请将您的代码更改为:

if (numberOfWords <= 25){textCost = TEXT_BASE_FEE + (TEXT_FLAT_FEE * numberOfWords);}否则 if (numberOfWords <= 35){textCost = TEXT_BASE_FEE + (TEXT_FLAT_FEE * 25) + (numberOfWords - 25) *LESS_OR_EQUAL_THAN_THIRTYFIVE;}else//注意 - 没有条件.{textCost = numberOfWords * MORE_THAN_THIRTYFIVE;}

对于 linkCost,将 switch 语句更改为:

开关(advPay){案例'y':链接成本 = (3 * LINK_FLAT_FEE) -(3 * LINK_FLAT_FEE) * THREE_MONTH_ADV_DISCOUNT;休息;案例n":链接成本 = LINK_FLAT_FEE;休息;默认:throw new Exception("指定的值无效:" + advPay);}

现在您可能不想在这里抛出异常.您可能想再次循环,或类似的东西.您可能不想只想使用裸Exception - 但您应该考虑您确实想要使用的确切异常类型.

这不是总是可能的.编译器确定明确赋值的规则相对简单.如果您真的无法更改代码以使编译器满意,您可以只分配一个虚拟初始值.不过,我建议尽可能避免这种情况.在您的第一种情况下,确实总是会分配该值 - 但在第二种情况下,当 advPay 既不是y"也不是n"时,您确实没有给出值' 这可能会导致以后出现难以诊断的问题.编译器错误可帮助您发现此类问题.

同样,我强烈建议您重构此方法.我怀疑您会发现,当每个方法中只有大约 10 行代码需要推理时,并且当每个变量在其第一次使用之前或第一次使用时被声明时,为什么没有明确分配的东西会更容易理解.

好的,彻底重构的代码如下.我不会声称它是世界上最好的代码,但是:

  • 它更易于测试.您可以轻松地为它的每个部分编写单元测试.printAllCosts 不是很容易测试,但你可以有一个重载,它需要一个 Writer 来打印 - 这会有所帮助.
  • 计算的每一位都在一个逻辑位置.链接和图形具有一小组可能的值 - Java 枚举在这里很合适.(我知道它们很可能超出您当前的技能水平,但很高兴看到可用的内容.)
  • 我不再使用二进制浮点数,因为它们不适用于数字.相反,我在任何地方都使用整数美分并转换为 BigDecimal 以用于显示目的.有关更多信息,请参阅我关于 .NET 浮点 的文章 - 它确实与 Java 相关.
  • 广告本身现在封装在一个类中.您可以根据需要在此处添加更多信息.
  • 代码在一个包中.诚然,目前所有这些都在一个文件中(这就是为什么只有 EntryPoint 类是公开的)但这只是为了 Stack Overflow 和我不必打开 Eclipse.
  • JavaDoc 解释了正在发生的事情 - 至少对于一些方法.(我可能会在实际代码中添加更多内容.我在这里没时间了.)
  • 我们验证用户输入(字数除外) - 我们在单个例程中执行该验证,该例程应该是可合理测试的.然后我们可以假设,每当我们要求输入时,我们都会得到一些有效的信息.
  • EntryPoint 中静态方法的数量有点惊人.感觉不是很糟糕 - 但我发现这通常是程序入口点的方式.请注意,这里与费用无关 - 基本上只是用户界面.

这里的代码比以前多 - 但它 (IMO) 的代码可读性和可维护性要高得多.

包装广告;导入 java.util.Scanner;导入 java.math.BigDecimal;/** 广告的图形样式.*/枚举图形{无(0),小 (1907),中 (2476),大 (2933);私人最终 int 成本;私人图形(int成本){this.cost = 成本;}/** 返回以美分为单位的成本.*/公共 int getCost(){退货成本;}}/** 广告的链接付款计划.*/枚举链接计划{无(0),PREPAID(1495),//1 个月POSTPAID(1495 * 3 - (1495 * 3)/10);//3 个月预付 10% 的折扣私人最终 int 成本;私人 LinkPlan(int 成本){this.cost = 成本;}/** 返回以美分为单位的成本.*/公共 int getCost(){退货成本;}}班级广告{私人最终 int wordCount;私人最终 LinkPlan linkPlan;私人最终图形图形;公共广告(int wordCount,LinkPlan linkPlan,Graphic graphics){this.wordCount = wordCount;this.linkPlan = 链接计划;this.graphic = 图形;}/*** 返回广告中文字的费用,以美分为单位.** 最多 25 个单词,每个单词的固定费用为 40c 和基本费用* 3.00 美元.** 含26-35个字,前25个字的费用和以前一样,* 但对于 26-35 个单词,每个单词的费用降至 35c.** 超过 35 个字,每字 32c 的固定费用,没有* 基本费用.*/public int getWordCost(){如果(字数> 35){返回 32 * 字数;}//始终应用固定费用,然后以 40 美分最多 25 个字,//然后剩下的 35 美分.返回 300 + Math.min(wordCount, 25) * 40+ Math.min(wordCount - 25, 0) * 35;}/*** 显示与此广告相关的费用.*/public void printAllCosts(){System.out.printf("		%-16s %11s
", "类别", "成本");printCost("Text", getWordCost());printCost("Link", linkPlan.getCost());printCost("Graphic",graphic.getCost());int total = getWordCost() + linkPlan.getCost() + graphics.getCost();打印成本(总",总);int gst = 总计/20;打印成本(消费税",消费税);printCost("含 GST 合计", total + gst);}private void printCost(String category, int cents){BigDecimal 美元 = new BigDecimal(cents).scaleByPowerOfTen(-2);System.out.printf("		%-16s %11.2f
", 类别, 美元);}}/*** 程序的入口点 - 接受用户输入,构建一个* 广告,并显示其成本.*/公共类入口点{public static void main(String[] args){扫描仪scanner = new Scanner(System.in);System.out.println("欢迎光临!");int wordCount = readWordCount(scanner);LinkPlan linkPlan = readLinkPlan(scanner);图形图形 = readGraphic(scanner);广告 advert = new Advertisement(wordCount, linkPlan, graphics);advert.printAllCosts();}private static int readWordCount(扫描仪扫描仪){System.out.print("请输入广告中的字数:");//可以在这里添加验证码返回scanner.nextInt();}私有静态 LinkPlan readLinkPlan(扫描仪扫描仪){System.out.print("你要添加一个链接吗(y = yes or n = no)?");char addLink = readSingleCharacter(scanner, "yn");LinkPlan linkPlan;如果(添加链接 == 'n'){返回 LinkPlan.NONE;}System.out.print("要不要提前3个月付款" +"(y = 是或 n = 否)?");char AdvancePay = readSingleCharacter(scanner, "yn");返回 AdvancePay == 'y' ?LinkPlan.PREPAID : LinkPlan.POSTPAID;}私有静态图形 readGraphic(扫描仪扫描仪){System.out.print("要添加图形/图片吗?" +"(s = 小,m = 中,l = 大或 n = 无)?");字符图形 = readSingleCharacter(scanner, "smln");开关(图形){case 's': 返回 Graphic.SMALL;case 'm': 返回 Graphic.MEDIUM;案例'l':返回Graphic.LARGE;case 'n': 返回 Graphic.NONE;默认:throw new IllegalStateException("意外状态;图形=" +形象的);}}私有静态字符 readSingleCharacter(扫描仪扫描仪,字符串有效选项){同时(真){字符串输入=scanner.next();if (input.length() != 1 || !validOptions.contains(input)){System.out.print("无效值,请重试:");继续;}返回 input.charAt(0);}}}

/*This is a program that calculates Internet advertising rates based on what features/options you choose.
 * 
 *  
 */

import java.util.Scanner;

public class InternetAdvertising 
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        int numberOfWords;      

        //I assigned 0 values to both as Eclipse suggested
        float textCost = 0;
        float linkCost = 0;     

        float graphicCost;

        //<=25 words is a flat fee of $.40 per word plus Base fee of $3.00 
        final float TEXT_FLAT_FEE = 0.40F;
        final float TEXT_BASE_FEE = 3.00F;

        //<=35 words is $.40 for the first 25 words and 
        //an additional $.35 per word up to and including 35 words plus Base fee of $3.00 
        final float LESS_OR_EQUAL_THAN_THIRTYFIVE = 0.35F;

        //Over 35 words is a flat fee of $.32 per word with no base fee
        final float MORE_THAN_THIRTYFIVE = 0.32F;


        System.out.println("Welcome!");

        System.out.print("Enter the number of words in your ad: ");
        numberOfWords = in.nextInt();

        if (numberOfWords <= 25)
        {
            textCost = TEXT_BASE_FEE + (TEXT_FLAT_FEE * numberOfWords);
        }

        else if (numberOfWords <= 35)
        {
            textCost = TEXT_BASE_FEE + (TEXT_FLAT_FEE * 25) + (numberOfWords - 25) * LESS_OR_EQUAL_THAN_THIRTYFIVE;
        }

        else if (numberOfWords > 35)
        {
            textCost = numberOfWords * MORE_THAN_THIRTYFIVE;
        }


        String addLink, advancePay;
        char link, advPay;

        final float LINK_FLAT_FEE = 14.95F;
        final float THREE_MONTH_ADV_DISCOUNT = 0.10F;

        System.out.print("Would you like to add a link (y = yes or n = no)? ");
        addLink = in.next();

        link = addLink.charAt(0);
        link = Character.toLowerCase(link); 

        if (link == 'y')
        {
            System.out.print("Would you like to pay 3 months in advance " + "(y = yes or n = no)? ");
            advancePay = in.next();

            advPay = advancePay.charAt(0);
            advPay = Character.toLowerCase(advPay);

            switch (advPay)
            {
                case 'y':

                    linkCost = (3 * LINK_FLAT_FEE) - (3 * LINK_FLAT_FEE) * THREE_MONTH_ADV_DISCOUNT;

                    break;

                case 'n':

                    linkCost = LINK_FLAT_FEE;

                    break;
            }               
        }

        else
        {
            linkCost = 0;
        }


        String addGraphic;
        char graphic;

        System.out.print("Would you like to add graphics/pictures" + "(S = Small, M = Medium, L = Large or N = None)? ");
        addGraphic = in.next();

        graphic = addGraphic.charAt(0);
        graphic = Character.toUpperCase(graphic);
        graphic = Character.toLowerCase(graphic);       
        switch (graphic)
        {
            case 's':

                graphicCost = 19.07F;

                break;

            case 'm':

                graphicCost = 24.76F;

                break;

            case 'l':

                graphicCost = 29.33F;

                break;

            default:
                graphicCost = 0;
        }


        float gst, totalBeforeGst, totalAfterGst;

        final float GST_RATE = 0.05F;

        totalBeforeGst = textCost + linkCost + graphicCost; //textCost & linkCost would not initialize

        gst = totalBeforeGst * GST_RATE;

        totalAfterGst = totalBeforeGst + (totalBeforeGst * GST_RATE);


        System.out.printf("		%-16s %11s
", "Category", "Cost");
        System.out.printf("		%-16s %11.2f
", "Text", textCost);  //linkCost would not initialize
        System.out.printf("		%-16s %11.2f
", "Link", linkCost);  //textCost would not initialize 
        System.out.printf("		%-16s %11.2f
", "Graphic", graphicCost);
        System.out.printf("		%-16s %11.2f
", "Total", totalBeforeGst);
        System.out.printf("		%-16s %11.2f
", "GST", gst);
        System.out.printf("		%-16s %11.2f
", "Total with GST", totalAfterGst);
    }   
}

I'm almost done with this code and Eclipse suggests that I assign 0 values to textCost and linkCost. Is there any other way to go around this problem. If I don't assign 0 values they get an error (The local variable XXX may not have been initialized). Can someone explain to me why this happens even though I have both variables assigned with equations?

Thanks.

EDIT: I did as suggested and declared the variables only when I'm going to need it. I also added some comments.

解决方案

Three suggestions before I delve any deeper into the code:

  • Declare variables as late as you can to make it easier to understand the code.
  • Refactor this giant method - it's unreadably huge at the moment.
  • Make the constants static final fields. They're not related to any particular call to the method, so they shouldn't be local variables.

Now as to the actual question, the simplest way is to make sure that every possible flow actually does assign a value or throw an exception. So for textCost, change your code to:

if (numberOfWords <= 25)
{
    textCost = TEXT_BASE_FEE + (TEXT_FLAT_FEE * numberOfWords);
}
else if (numberOfWords <= 35)
{
    textCost = TEXT_BASE_FEE + (TEXT_FLAT_FEE * 25) + (numberOfWords - 25) * 
               LESS_OR_EQUAL_THAN_THIRTYFIVE;
}
else // Note - no condition.
{
    textCost = numberOfWords * MORE_THAN_THIRTYFIVE;
}

For linkCost, change your switch statement to something like:

switch (advPay)
{
    case 'y':
        linkCost = (3 * LINK_FLAT_FEE) - 
                   (3 * LINK_FLAT_FEE) * THREE_MONTH_ADV_DISCOUNT;
        break;
    case 'n':
        linkCost = LINK_FLAT_FEE;
        break;
    default:
        throw new Exception("Invalid value specified: " + advPay);
}

Now you may not want to throw an exception here. You might want to loop round again, or something like that. You probably don't want to use just bare Exception - but you should think about the exact exception type you do want to use.

It's not always possible to do this. The rules by the compiler to determine definite assignment are relatively straightforward. In cases where you really can't change the code to make the compiler happy like this, you can just assign a dummy initial value. I'd recommend trying to avoid this wherever possible though. In your first case, the value really would always be assigned - but in the second case you really weren't giving a value when advPay was neither 'y' nor 'n' which could lead to a hard-to-diagnose problem later on. The compiler error helps you spot this sort of problem.

Again though, I strongly suggest you refactor this method. I suspect you'll find it a lot easier to understand why things aren't definitely assigned when there's only about 10 lines of code to reason about in each method, and when each variable is declared just before or at its first use.

EDIT:

Okay, the radically refactored code is below. I'm not going to claim it's the best code in the world, but:

  • It's more testable. You could easily write unit tests for each part of it. printAllCosts isn't terribly easily testable, but you could have an overload which took a Writer to print to - that would help.
  • Each bit of calculation is in a logical place. Links and graphics have a small set of possible values - Java enums are a natural fit here. (I'm aware they may well be beyond your current skill level, but it's good to see what will be available.)
  • I'm not using binary floating point numbers any more, because they're inappropriate for numbers. Instead, I'm using an integer number of cents everywhere and converting to BigDecimal for display purposes. See my article on .NET floating point for more information - it's all relevant to Java really.
  • The advert itself is now encapsulated in a class. You could add a lot more information here as and when you needed to.
  • The code is in a package. Admittedly it's all in one file at the moment (which is why only the EntryPoint class is public) but that's just for the sake of Stack Overflow and me not having to open up Eclipse.
  • There's JavaDoc explaining what's going on - at least for a few methods. (I would probably add some more in real code. I'm running out of time here.)
  • We validate user input, except for the word count - and we perform that validation in a single routine, which should be reasonably testable. We can then assume that whenever we've asked for input, we've got something valid.
  • The number of static methods in EntryPoint is slightly alarming. It doesn't feel terribly OO - but I find that's often the way around the entry point to a program. Note that there's nothing to do with fees in there - it's just the user interface, basically.

There's more code here than there was before - but it's (IMO) much more readable and maintainable code.

package advertising;

import java.util.Scanner;
import java.math.BigDecimal;

/** The graphic style of an advert. */
enum Graphic
{
    NONE(0),
    SMALL(1907),
    MEDIUM(2476),
    LARGE(2933);

    private final int cost;

    private Graphic(int cost)
    {
        this.cost = cost;
    }

    /** Returns the cost in cents. */
    public int getCost()
    {
        return cost;
    }
}

/** The link payment plan for an advert. */
enum LinkPlan
{
    NONE(0),
    PREPAID(1495), // 1 month
    POSTPAID(1495 * 3 - (1495 * 3) / 10); // 10% discount for 3 months up-front

    private final int cost;

    private LinkPlan(int cost)
    {
        this.cost = cost;
    }

    /** Returns the cost in cents. */
    public int getCost()
    {
        return cost;
    }
}

class Advertisement
{
    private final int wordCount;
    private final LinkPlan linkPlan;
    private final Graphic graphic;

    public Advertisement(int wordCount, LinkPlan linkPlan, Graphic graphic)
    {
        this.wordCount = wordCount;
        this.linkPlan = linkPlan;
        this.graphic = graphic;
    }

    /**
     * Returns the fee for the words in the advert, in cents.
     * 
     * For up to 25 words, there's a flat fee of 40c per word and a base fee
     * of $3.00.
     * 
     * For 26-35 words inclusive, the fee for the first 25 words is as before,
     * but the per-word fee goes down to 35c for words 26-35.
     * 
     * For more than 35 words, there's a flat fee of 32c per word, and no
     * base fee.     
     */
    public int getWordCost()
    {
        if (wordCount > 35)
        {
            return 32 * wordCount;
        }
        // Apply flat fee always, then up to 25 words at 40 cents,
        // then the rest at 35 cents.
        return 300 + Math.min(wordCount, 25) * 40
                   + Math.min(wordCount - 25, 0) * 35;        
    }

    /**
     * Displays the costs associated with this advert.
     */
    public void printAllCosts()
    {
        System.out.printf("		%-16s %11s
", "Category", "Cost");
        printCost("Text", getWordCost());
        printCost("Link", linkPlan.getCost());
        printCost("Graphic", graphic.getCost());
        int total = getWordCost() + linkPlan.getCost() + graphic.getCost();
        printCost("Total", total);
        int gst = total / 20;
        printCost("GST", gst);
        printCost("Total with GST", total + gst);
    }

    private void printCost(String category, int cents)
    {
        BigDecimal dollars = new BigDecimal(cents).scaleByPowerOfTen(-2);
        System.out.printf("		%-16s %11.2f
", category, dollars);
    }
}

/**
 * The entry point for the program - takes user input, builds an 
 * Advertisement, and displays its cost.
 */
public class EntryPoint
{
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);

        System.out.println("Welcome!");
        int wordCount = readWordCount(scanner);
        LinkPlan linkPlan = readLinkPlan(scanner);
        Graphic graphic = readGraphic(scanner);

        Advertisement advert = new Advertisement(wordCount, linkPlan, graphic);
        advert.printAllCosts();
    }

    private static int readWordCount(Scanner scanner)
    {
        System.out.print("Enter the number of words in your ad: ");
        // Could add validation code in here
        return scanner.nextInt();
    }

    private static LinkPlan readLinkPlan(Scanner scanner)
    {
        System.out.print("Would you like to add a link (y = yes or n = no)? ");
        char addLink = readSingleCharacter(scanner, "yn");
        LinkPlan linkPlan;
        if (addLink == 'n')
        {
            return LinkPlan.NONE;
        }
        System.out.print("Would you like to pay 3 months in advance " +
                         "(y = yes or n = no)? ");
        char advancePay = readSingleCharacter(scanner, "yn");
        return advancePay == 'y' ? LinkPlan.PREPAID : LinkPlan.POSTPAID;
    }

    private static Graphic readGraphic(Scanner scanner)
    {
        System.out.print("Would you like to add graphics/pictures? " +
            "(s = small, m = medium, l = large or n = None)? ");
        char graphic = readSingleCharacter(scanner, "smln");
        switch (graphic)
        {
            case 's': return Graphic.SMALL;
            case 'm': return Graphic.MEDIUM;
            case 'l': return Graphic.LARGE;
            case 'n': return Graphic.NONE;
            default:
                throw new IllegalStateException("Unexpected state; graphic=" +
                                                graphic);
        }
    }

    private static char readSingleCharacter(Scanner scanner,
                                            String validOptions)
    {
        while(true)
        {
            String input = scanner.next();
            if (input.length() != 1 || !validOptions.contains(input))
            {
                System.out.print("Invalid value. Please try again: ");
                continue;
            }
            return input.charAt(0);
        }
    }
}

这篇关于如何避免“局部变量可能尚未初始化"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆