繁体   English   中英

整数不能转换为布尔值

[英]Int can't be converted into boolean

我需要将菜单可视化到功能菜单中,然后使用开关来区分情况,但是在 while 条件中存在一个问题,即“int 无法转换为布尔值”,即使scelta变量和返回类型菜单功能都是int。 谁能给我一个帮助? 我是 Java 新手。

public class PComputer {
    
    public static void main(String[] args) 
    {
        int scelta;
      
        while(scelta=menu())
        {
          //code
        }
  
    }
    
    static int menu()
    {
        Scanner keyboard = new Scanner(System.in);
        
        int scelta;
        
        do
        {
            System.out.println("************************************************************");
            System.out.println("ACCESSO AL MENU DI SISTEMA-SELEZIONARE L'AZIONE VOLUTA: ");
            System.out.println("1- Creazione e inserimento dati studente: ");
            System.out.println("2- Creazione e inserimento dati computer: ");
            System.out.println("3- Aggiugni computer: ");
            System.out.println("4- Elimina computer: ");
            System.out.println("5- Ricerca per codice: ");
            System.out.println("6- Ricerca computer acquistati dopo una certa data: ");
            System.out.println("7- Ricerca computer con una certa caratteristica: ");
            System.out.println("8- Elenco studenti a cui è stato assegnato un pc: ");
            System.out.println("0- Esci");
            System.out.println("************************************************************");
            scelta=keyboard.nextInt();    
            
            if(scelta<0 || scelta>9)
            {
                System.out.println("Si prega di inserire un numero valido!");
            }
        }
        while(scelta>0 || scelta<9);
        
        return scelta;
    } 
}

对这段代码的意图有两种不同的解释。 仅查看代码时会出现明显的一个,但是您在代码段周围的文本暗示了另一个。

感觉就像是 A 人写了这段代码,给了你,现在你在问关于它的问题。 在这种情况下,您已经相当彻底地误解了 while 循环中发生的事情。

在任何情况下,任何一种解释都需要代码更新; 照原样,代码不能像您想象的那样工作(它不能编译)。

解释1:真/假

main方法代码应该如下工作:

询问用户他们想要哪个选项,并将结果存储在scelta 暂时忘记 while 循环,只需一次你就可以这样写:

scelta = menu();

这就是 java-ese:运行菜单方法,然后将它返回的scelta分配给scelta变量。

此外, main方法不只是想这样做一次,它想重复这样做,直到用户选择选项 0。

现在您需要知道两件事才能理解为什么在几乎所有的编程环境中,编写的代码都会完成这个精确的事情。 它只是在java中不起作用。 这就是为什么我认为这是原作者的意图。

  • 赋值本身就是表达式。 就像5 + 5是 10,并且menu()解析为用户选择的任何选项, a = 5a = 5的值赋给 a 但它本身也是一个值为 5 的表达式。 int b = (a = 5) + 20是有效的 java(在许多其他语言中也是有效的),意味着 a 是 5,而 b 最终是 20。因此, scelta = menu()不仅是“向用户询问菜单”,而且是“然后将该值分配给scelta ,它甚至做了第三件事:整个表达式也是选择的值。
  • 几乎每个表达式,无论是否为布尔值,在 while 循环中都是合法的(但在 java 中不合法!! ),并且一个有点复杂的规则列表决定了该值是被视为“真”还是“假”。

显然布尔值true被认为是 true,但在许多语言中,如果字符串不为空则认为是 true,如果为空则认为是 false,如果数字不为 0 则认为是 true,如果为 0 则为 false . 这称为truthy/falsy:例如,在javascript 中, 0为falsy, 1为truthy。 您现在可以在浏览器中尝试此操作(打开开发控制台):

var a = 1;
if (a) console.log("Whoa");

将其复制/粘贴进去,然后会出现“哇”,因为 javascript 会考虑 a 的值(此处为1 ),是真的。

结合这两个因素,瞧:此代码将完全按照您的要求执行(反复询问菜单,并让变量scelta包含选项,并在用户选择0时中止 while 循环,这是列表),并且所有内容都在一行中,就while (scelta = menu())

但是java不能那样工作。

在 java 中, true为 true, false为 false,所有其他值既不是 true 也不是 false:它们只是编译器错误。

真/假很方便,但太容易被误解并且有太多难以回答的问题。 字符串“false”是真还是假? 字符串“”(注意空格)是真还是假? 在 bash 中, 0为真,非零为假,在所有其他真/假语言中,情况正好相反。 鉴于=是赋值,如果 java 是真/假,将==输入单个=不会是编译器错误(您希望拼写错误是编译器错误,所以这很糟糕),依此类推。 所以java只是不“做”真/假,在我看来,这是优秀的语言设计。

幸运的是,在 Java 中也很容易让这个循环做你想做的事情:你需要的只是明确说明你希望 0 被认为是假的:

while ((scelta = menu()) != 0) {
 ...
}

解读2:你的意思是比较

您的问题包括以下文字:

变量和菜单函数的返回类型都是int。 谁能给我一个帮助

听起来您认为此代码旨在比较scelta 和 menu(),并在它们相等时进行循环。

但这种解释毫无意义。 scelta还没有一个值,所以即使你把它变成== (在 Java 中, =是赋值,而==是'它们相等吗?)代码仍然会因为不同的错误而无法编译(试图读取scelta在为其分配值之前)。 但仅仅看这段代码,整个概念毫无意义。 有一个包含选项的变量,然后向用户显示一个菜单,然后只要他们选择与您预先为他们选择的选项相同的选项就循环,这有什么意义?

无论如何,如果这正是您想要的,只需使==解决您当前遇到的问题,但随后您将遇到下一个问题(当然,代码中可能有 1 个以上的错误) .

但我对此表示怀疑。 重读解释1,这就是你想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM