Java 将 parseInt 与 try catch 块一起使用时出现问题
Java issue using parseInt with a try catch block
我正在做一个练习,我必须 select 电影的类别(类型)并且根据我的 selection,程序将 return 列表来自对象 ArrayList 的该类别中的电影。
我的程序在以字符串格式输入类别时可以正常工作。但是,我正在尝试使用 try catch 块来允许按编号分类 selection。
我的 catch 块在工作,但是我的 try 块没有,return什么都没有。有人可以帮我确定我的代码有什么问题吗?我猜我的 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);
}
}
按照您的 if 子句的结构方式,只要 numSel
不是 6,就会调用 else 子句,将 catSel
替换为空字符串。
您可能希望在每个 if 块之后添加一个 else
或将它们全部替换为 switch
语句。
正如@Dragondraikk 所建议的那样,您的 if-else 子句 的结构方式与您的预期结果不符。
所以要么这样使用:
if(someCondition){
}
else if(someCondition){
}
...........................
do whatever you want to do
...........................
else{
}
下面是Switch语句的使用方法
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 块
更新
使用 Switch 优于 If else[=49 的优势=]
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
}
(显然,像这样的少量语句,还算不错)
但我无法知道您在中途更改了条件变量而不阅读每条语句。但是,因为 switch 只能将您限制为单个条件变量,所以我一眼就能看出发生了什么。
另一个优势是JumpTable
一个开关经常被编译成一个跳转-table(一个比较找出哪个代码到运行),或者如果不是可能的话,编译器仍然可以重新排序比较,以便在值之间执行二进制搜索(log N 比较)。 if-else 链是 线性搜索 .
这里有更多关于 Switch Statement
我正在做一个练习,我必须 select 电影的类别(类型)并且根据我的 selection,程序将 return 列表来自对象 ArrayList 的该类别中的电影。
我的程序在以字符串格式输入类别时可以正常工作。但是,我正在尝试使用 try catch 块来允许按编号分类 selection。
我的 catch 块在工作,但是我的 try 块没有,return什么都没有。有人可以帮我确定我的代码有什么问题吗?我猜我的 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);
}
}
按照您的 if 子句的结构方式,只要 numSel
不是 6,就会调用 else 子句,将 catSel
替换为空字符串。
您可能希望在每个 if 块之后添加一个 else
或将它们全部替换为 switch
语句。
正如@Dragondraikk 所建议的那样,您的 if-else 子句 的结构方式与您的预期结果不符。
所以要么这样使用:
if(someCondition){
}
else if(someCondition){
}
...........................
do whatever you want to do
...........................
else{
}
下面是Switch语句的使用方法
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 块
更新
使用 Switch 优于 If else[=49 的优势=]
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
}
(显然,像这样的少量语句,还算不错)
但我无法知道您在中途更改了条件变量而不阅读每条语句。但是,因为 switch 只能将您限制为单个条件变量,所以我一眼就能看出发生了什么。
另一个优势是JumpTable
一个开关经常被编译成一个跳转-table(一个比较找出哪个代码到运行),或者如果不是可能的话,编译器仍然可以重新排序比较,以便在值之间执行二进制搜索(log N 比较)。 if-else 链是 线性搜索 .
这里有更多关于 Switch Statement