我正在进行练习,我必须选择一个电影的类别(类型),根据我的选择,程序将从对象的ArrayList中返回该类别中的电影列表。
我的程序在以字符串格式输入类别时有效。但是我试图使用try catch块来允许按编号选择类别。
我的catch块工作正常,但是我的try块不是,并且什么都不返回。有人可以帮我确定我的代码有什么问题吗?我猜我的parseInt赋值有问题吗?
System.out.print("What category are you interested in?");
String catSel = sc.next();
try //Check category for Integer, otherwise catch
{
int numSel = Integer.parseInt(catSel);
if(numSel == 1)
{catSel = "animated" ;}
if(numSel == 2)
{catSel = "drama";}
if(numSel == 3)
{catSel = "horror";}
if(numSel == 4)
{catSel = "scifi";}
if(numSel == 5)
{catSel = "musical";}
if(numSel == 6)
{catSel = "comedy";}
else catSel = "";
//Check each movie for chosen category
for(int x = 0; x < list.size() - 1; x++)
{
if(catSel.equals(list.get(x).category))
System.out.println(list.get(x).movie);
}
}
catch (NumberFormatException e)
{
//Check each movie for chosen category
for(int x = 0; x < list.size() - 1; x++)
{
if(catSel.equals(list.get(x).category))
System.out.println(list.get(x).movie);
}
}
答案 0 :(得分:1)
if-clause的结构方式,只要numSel
不是6,就会调用else子句,用空字符串替换catSel
。
您可能希望在每个if块之后添加else
,或者使用switch
语句替换所有{{1}}。
答案 1 :(得分:1)
正如@Dragondraikk建议您 if-else子句的结构方式不符合您的预期结果。
所以要么以这种方式使用:
if(someCondition){
}
else if(someCondition){
}
...........................
do whatever you want to do
...........................
else{
}
以下是使用切换声明
的方法switch(Integer.parseInt(catSel)){
case 1 :
do Something....
break;
case 2 :
do Something....
break;
case 3 :
do Something....
break;
case 4 :
do Something....
break;
case 5 :
do Something....
break;
case 6 :
do Something....
break;
default :
catSel="";
break;
}
注意:您可以在此
周围使用try-catch块更新
使用 切换 优于 的优势<还是
if ... else if ...链的问题是可读性,我必须查看每个if条件以了解程序正在做什么。例如,您可能会遇到以下情况:
if (a == 1) {
// stuff
} else if (a == 2) {
// stuff
} else if (a == 3) {
// stuff
} else if (b == 1) {
// stuff
} else if (b == 2) {
// stuff
}
(显然,对于像这样的少量陈述,它并不是那么糟糕)
但我无法知道你在没有阅读每一个语句的情况下中途改变了条件变量。但是,因为开关仅将您限制为单个条件变量,所以我可以一目了然地看到发生了什么。
另一个优点是JumpTable
开关通常被编译为跳转表(一次比较以找出要运行的代码),或者如果不可能,编译器仍然可以对比较进行重新排序,以便在值之间执行二进制搜索(log N比较)。 if-else链是线性搜索。
的更多信息