【问题标题】:Where should I start and end the while loop here我应该在哪里开始和结束while循环
【发布时间】:2015-02-06 20:16:42
【问题描述】:

我能够让代码工作,下一个挑战是把它放在一个循环中多次工作,如果用户输入 -ve 数字或 0,循环应该结束。 我是一个完整的初学者,请不要因为愚蠢的代码而诅咒我。

package Exceptions;

import java.util.Scanner;

public class usrDefined {

    public static void main(String[] args) {

        try {
            String s;
            int i;
            Scanner a = new Scanner(System.in);
            System.out.print("Enter your Name: ");
            s = a.nextLine();
            System.out.print("Enter your Age: ");
            i = a.nextInt();
            while((i = a.nextInt())!= -(i = a.nextInt()) && (i = a.nextInt())!= 0 ) 
            if (i < 18) {
                throw new AgeException();
            } 
            System.out.print("You are eligible for the deal " + s);
        } catch (AgeException e) {
            e.specifyException();

        }
    }
}

class AgeException extends Exception {
    public void specifyException() {
        System.out.println("Sorry,you are not eligible");
    }

}

【问题讨论】:

  • throw new AgeException(); - 为什么?
  • 它甚至可以编译吗? if ((a.nextInt) &gt; 18); 是什么意思?
  • 你为什么不先告诉我们出了什么问题?你声称出了什么问题,但懒得提它是什么。此外,当您应该只使用 if 语句时,您似乎正在抛出异常。 异常行为例外。
  • 正如@MarounMaroun 所说,a 无法在AgeException 类中访问。

标签: java


【解决方案1】:

这不是异常的工作方式。当你throw异常时,异常条件已经发生;你正在报告它。因此,使用此代码,您将在输入try 块后立即自动生成异常情况。此外,条件未在异常类定义中的特殊 specifyException 方法中指定。另外,当您捕获异常时,即处理异常条件时,而不是未发生异常条件时。

要使用您的AgeException

  1. 删除顶部的 throw 语句。
  2. 从用户输入中捕获年龄后,使用正常的if 条件测试年龄。在 if 块内,抛出一个 AgeException 的实例。
  3. if 块之后,但仍在try 块中,打印您的“您符合条件”消息。如果未引发异常,则用户“符合条件”。
  4. 捕获异常时,打印“不合格”消息。

但是,在这里使用异常似乎并不正确。某人的年龄小于 18 岁对我来说似乎不是一个特殊的条件。一个简单的 if/else 是一个更好的设计。

【讨论】:

  • 感谢您协助 rgettman。我知道例外不是很好的匹配,但这是我的教授给的一个小任务
  • 我猜到了,所以我提供了有关如何使用 AgeException 使其工作的提示。
【解决方案2】:

我不确定该异常的目的是什么,或者为什么尝试这样做。如果您只是想检查一个值是否小于 18,您可以使用简单的 if 语句来做到这一点:

String s;
int i;
Scanner a = new Scanner(System.in);
System.out.println("Enter your Name: ");
s = a.nextLine();
System.out.println("Enter your Age: ");
i = a.nextInt();

if (i < 18) {
    System.out.println("Sorry,you are not eligible");
    // presumably exit the application here as well?
} else {
    System.out.println("You are eligible for the deal!!!");
    // presumably continue with other logic here as well?
}

作为一般规则,永远不要对逻辑流程使用例外。为此目的存在条件构造(通常是if 语句)。应该使用异常来退出处于错误状态的方法或操作,以便使用该方法或操作的代码可以响应该错误状态。检查用户的年龄不是错误状态,它只是业务逻辑。


至于为什么你的代码“不起作用”,有几个问题......

此行将立即退出代码块:

throw new AgeException();

这是因为它会引发异常。因此,该行之后的 nothing 将执行。代码将立即转到catch 块,因此此处预期的行为是永远不会提示用户输入,并且总是立即告知他们有资格进行交易。

另外,这里还有三个错误:

if ((a.nextInt) > 18);

第一个错误是该上下文中没有a 变量。该变量在main 方法中。因此需要将其传递给 specifyException 方法才能使用它。

第二个错误是分号。除非编译器在语法上抱怨它(我对 Java 不够熟悉,无法确定),否则基本上会渲染整个 if 块,因为它代表一个空语句。所以整个块翻译成“如果值大于 18,什么都不做”。

第三个错误是您忘记了nextInt() 的括号。

最后,即使你立即抛出异常,你也不会在任何地方调用specifyException 方法。所以这个逻辑永远不会被调用。如果您在何处或如何调用该方法看起来不直观,那是因为它处于异常状态,并且将异常用于逻辑流本质上是不直观和错误的 :)

【讨论】:

    【解决方案3】:

    我不确定使用异常处理这个是否正确,但你可以试试这个:

    UsrDefined.java

    package exceptions;
    
    import java.util.Scanner;
    
    public class UsrDefined {
    
    
    
        public static void main(String[] args) {
    
        try{
             System.out.print("Enter your age:"); 
             Scanner a = new Scanner(System.in);
             checkAge(a);
        }catch (AgeException e){
             System.out.println(e.getMessage());
        }
    }
        private static void checkAge(Scanner a) throws AgeException {
    
            if(a.nextInt() < 18) {
                throw new AgeException("You are not eligible for the deal!");
                 }
    
        }
    
    
    }
    

    AgeException.java

    package exceptions;
    
    public class AgeException extends Exception {
    
        private static final long serialVersionUID = 1L;
    
        public AgeException(String msg) {
            super(msg);
        }
    
    }
    

    【讨论】:

    • throw new AgeException("你不符合交易条件!");无法访问 UsrDefined 类型的封闭实例。必须使用 UsrDefined 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 UsrDefined 的实例)。
    【解决方案4】:

    不需要抛出异常或良好的设计。我想这就是你想要的:

     public static void main(String[] args) {
         Scanner a = new Scanner(System.in);
         System.out.println("Enter your Name: ");
         String s = a.nextLine();
         System.out.println("Enter your Age: ");
         int i = a.nextInt();
         if (ageOk(a)) {
             System.out.println("You are eligible for the deal!!!");
         }
    }
    
    private static boolean ageOk(int age) {
         return age > 18;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      相关资源
      最近更新 更多