2016-03-03 76 views
0

嘿,大家我正在用java(我目前还在学习语言)的个人项目工作,并带着一个或两个问题来到这里。扫描仪不按预期工作

首先问

在我try块允许我要求用户输入一个值赋给一个变量,并且在我的catch块,如果用户输入一个错误的值或跳过该条目,它抛出异常并通知用户已设置了默认值。这是做到这一点的正确方法是?

代码示例

(注:我有很多这样的尝试工作方式与方法中下面的一个相同/ catch语句)

try { 
     System.out.print("Please enter a value for price of computer: "); 
     price = sc.nextFloat(); 

    } catch (InputMismatchException ex) { //Catch skip or error 
     System.out.println("You entered an invalid value for price, it is assumed to be 0."); 
     price = 0F; //Assign a default value 
    } 

第二个问题

当我编译并执行它,它不允许我输入变量,而是跳到异常。我不确定我错过了什么,所以我会喜欢任何建议,并再次感谢一个伟大的社区。

+0

您是否清除了扫描仪缓冲区? – Paul

+0

我以为你不能明确地清除扫描仪的缓冲区。我在内部读过某处,它可能会在读取令牌后清除缓冲区,但这是程序员触及范围之外的实现细节。 – CoderC

+0

要清除它,只需在将扫描仪用于其他数据类型之前调用nextLine()方法;例如,如果您使用nextLine()方法,然后想要使用nextFloat()方法,则必须创建一个新对象,或者您必须在nextFloat()方法之前再次使用nextLine()方法 – Paul

回答

0

此代码看起来大部分是正确的。虽然,我假设您的sc变量是通过多个输入(如您陈述的)相同的扫描器对象,所以其缓冲区可能不会像您在每次使用sc.nextFloat()方法时所假定的那样被清除。

您可以通过重新初始化扫描仪对象,然后再次使用它来避免这种情况。如果我没有记错,没有办法清楚地清除扫描仪对象的缓冲区,所以它必须重新初始化以“清除”它。您可以使用sc.hasNextFloat()验证是否已输入浮点值。

您也可以使用和Float.parseFloat(sc.nextLine())在输入新行之前捕获整个输入。

0

工作代码:

import java.util.*; 

public class InputTest{ 
    public static void main(String args[]) { 
     float price = -1F; 
     try { 
      Scanner sc = new Scanner(System.in); 
      System.out.println("Please enter a value for price of computer: "); 
      if (sc.hasNextFloat()){ 
       price = sc.nextFloat(); 
      } 
     } catch (InputMismatchException ex) { //Catch skip or error 
      System.out.println("You entered an invalid value for price, it is assumed to be 0."); 
      price = 0F; //Assign a default value 
     }catch(Exception err){ 
      err.printStackTrace(); 
     } 
     System.out.println("price:"+price); 

    } 
} 

输出:

我已经指派值浮动变量之前添加sc.hasNextFloat():从您的代码段

D:\Study\Java>java InputTest 
Please enter a value for price of computer: 
1 
price:1.0 

D:\Study\Java>java InputTest 
Please enter a value for price of computer: 
2 
price:2.0 

D:\Study\Java>java InputTest 
Please enter a value for price of computer: 
3.3 
price:3.3 

变化。当您从控制台读取数值时,请勿在输入值中输入f或F.为了更好的理解,我提供了示例输入值。

0

好吧,我发现我的错误感谢大家的帮助在这里在stackoverflow。

当我初始化我的扫描仪可变我做了这样的:扫描仪SC =新的扫描仪(“System.in”)

这意味着我想它读取用户这样一个字符串,而不是输入会自动抛出我的异常。

要解决此问题,我删除了引号,现在它正常工作!

再次感谢大家!