[英]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 循环中发生的事情。
在任何情况下,任何一种解释都需要代码更新; 照原样,代码不能像您想象的那样工作(它不能编译)。
main
方法代码应该如下工作:
询问用户他们想要哪个选项,并将结果存储在scelta
。 暂时忘记 while 循环,只需一次你就可以这样写:
scelta = menu();
这就是 java-ese:运行菜单方法,然后将它返回的scelta
分配给scelta
变量。
此外, main
方法不只是想这样做一次,它想重复这样做,直到用户选择选项 0。
现在您需要知道两件事才能理解为什么在几乎所有的编程环境中,编写的代码都会完成这个精确的事情。 它只是在java中不起作用。 这就是为什么我认为这是原作者的意图。
5 + 5
是 10,并且menu()
解析为用户选择的任何选项, a = 5
将a = 5
的值赋给 a 但它本身也是一个值为 5 的表达式。 int b = (a = 5) + 20
是有效的 java(在许多其他语言中也是有效的),意味着 a 是 5,而 b 最终是 20。因此, scelta = menu()
不仅是“向用户询问菜单”,而且是“然后将该值分配给scelta
,它甚至做了第三件事:整个表达式也是选择的值。 显然布尔值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) {
...
}
您的问题包括以下文字:
变量和菜单函数的返回类型都是int。 谁能给我一个帮助
听起来您认为此代码旨在比较scelta 和 menu(),并在它们相等时进行循环。
但这种解释毫无意义。 scelta
还没有一个值,所以即使你把它变成==
(在 Java 中, =
是赋值,而==
是'它们相等吗?)代码仍然会因为不同的错误而无法编译(试图读取scelta
在为其分配值之前)。 但仅仅看这段代码,整个概念毫无意义。 有一个包含选项的变量,然后向用户显示一个菜单,然后只要他们选择与您预先为他们选择的选项相同的选项就循环,这有什么意义?
无论如何,如果这正是您想要的,只需使==
解决您当前遇到的问题,但随后您将遇到下一个问题(当然,代码中可能有 1 个以上的错误) .
但我对此表示怀疑。 重读解释1,这就是你想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.