【问题标题】:Java issue using parseInt with a try catch block使用带有 try catch 块的 parseInt 的 Java 问题
【发布时间】:2015-01-28 12:45:19
【问题描述】:

我正在做一个练习,我必须选择一个电影类别(类型),根据我的选择,程序将从对象的 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);
                      }
                    }

【问题讨论】:

  • 那么,这里有什么问题,你能澄清一下吗?
  • 有 catSel 值还是在 try 块中总是调用 else?
  • 当您输入类别的数值(例如 1、2、3 等)时,它应该检查字符串中的整数,然后相应地设置类别并返回该类别中的所有电影。它没有。但是,如果我键入“戏剧”类别,它就可以正常工作。

标签: java try-catch parseint


【解决方案1】:

你的 if 子句的结构方式是,只要 numSel 不是 6,就会调用 else 子句,用空字符串替换 catSel

您可能希望在每个 if 块之后添加一个 else,或者将它们全部替换为 switch 语句。

【讨论】:

  • Dragondraikk,当然可以!我需要'else if' 而不仅仅是'if'。这解决了我的问题。愚蠢的新手错误:) 谢谢。
【解决方案2】:

正如@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

的优势

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 链是线性搜索

这里有更多关于Switch Statement的信息

【讨论】:

  • Switch 语句是通常首选的方法吗?每种方式的优点或缺点是什么?一种方式是否比另一种方式有任何明显的性能优势?
  • Switch 是使用常量和枚举的正确方法。 if-else 是使用变量和可变对象的正确方法,因为 switch 在编译时需要数据。 if-else 更灵活,但更长且更难阅读。性能是一样的,因为开关基本上是 if-else 的养眼
  • @AngeloAlvisi 我在所有方面都同意你的观点,但你能否查看一下这个以澄清性能点:If vs. Switch Speed
  • 感谢您的帮助。
猜你喜欢
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多