【问题标题】:Where do I write the code to handle my exception?我在哪里编写代码来处理我的异常?
【发布时间】:2014-09-29 14:23:20
【问题描述】:

好的。所以我有一个名为“PayrollDemo”的类,它使用了一个名为“Payroll”的类。我已经设置了几个异常类来管理某些异常,现在我只需要弄清楚如何抛出这些异常。

我想,我应该通过一系列 if 语句来检查输入的每个字段是否符合正确的标准。问题是,由于异常处理与我正在处理的类不同,所以我不确定如何抛出它。

所以在这里我要确保名称字符串不为空,如果它应该导致一个名为“InvalidNameException”的异常并将其抛出到我与我在同一文件夹中的“InvalidNameException”类“工资演示”类。

public class PayrollDemo
{
public static void main(String[] args)
{
  Payroll pr = new Payroll ("Test Name", 234);

  System.out.println("Current Employee Information. \n");
  System.out.println("Name: " + pr.getName());
  System.out.println("ID: " + pr.getID());
  System.out.println("Hourly Pay Rate: " + pr.getHourlyPayRate());
  System.out.println("Number Hours Worked: " + pr.getNumHoursWorked());
  System.out.println("Gross Pay: $" + pr.calculateGrossPay() + "\n");

  System.out.println("Welcome to the payroll screen. \n");
  Scanner keyboard = new Scanner(System.in);
  System.out.print("Please enter a name: ");
  String newName = keyboard.nextLine();
  System.out.print("Please enter an ID: ");
  int newID = keyboard.nextInt();
  pr.setID(newID);
  System.out.print("Please enter an hourly pay rate: ");
  double newPayRate = keyboard.nextDouble();
  pr.setHourlyPayRate(newPayRate);
  System.out.print("Please enter the number of hours worked: ");
  int newHours = keyboard.nextInt();
  pr.setNumHoursWorked(newHours);

  if (newName == "")
  {
     throw new InvalidNameException();
  }
  else
  {
     pr.setName(newName);
  }

这里是 InvalidNameException

public class InvalidNameException extends Exception
{
/**
    No-arg constructor
*/

public InvalidNameException()
 {
    super("Invalid name");
 }
}

【问题讨论】:

  • 也许是我,但我不清楚你的问题到底是什么。你能澄清一下你在问什么吗?
  • 这些将处理异常的类是什么样的?
  • string == "" 永远不会是真的
  • @HovercraftFullOfEels - 我想知道如何向另一个类抛出异常。就像我的 InvalidNameException 一样。那是我与 PayrollDemo 在同一文件夹中的另一个类。我想要它做的是检查用户输入的名称是否为空字符串,如果是,则意味着将此异常抛出到将处理它的异常类。如果一切顺利,它将照常进行。
  • @WillTroll == 表示对象身份,而不是相等。您可以有 2 个单独的 String 对象,它们都是零长度,这样 string1 == string2 为假,但 string1.equals(string2) 为真

标签: java exception throws


【解决方案1】:

您正确地抛出了异常。但是你从main() 扔掉它。因此,它将导致main() 的执行立即终止并出现异常,这意味着程序将打印堆栈跟踪并退出,除非您使用try 块括起来。

您需要编写一个方法,该方法具有try 块并调用包含您发布的代码的另一个方法(可能在不同的类上)。在 try 块的末尾,您捕获 InvalidNameException 并执行一些操作(例如再次将用户发送回数据条目)。

编辑: 异常类InvalidNameException处理异常。 个例外。您在此类上编写的唯一代码将是描述异常条件所需的代码 - 例如,您可以为其提供一个属性,该属性是名称的实际值。

【讨论】:

    【解决方案2】:

    你很亲密。警告:以下代码未经测试,它只是您想要做的事情的要点。

    您可以做的一件事是创建一个处理用户输入的类。这个类读取输入,验证它,并抛出任何不同类型的异常:

    public class UserInput{
        private Scanner keyboard;
    
        public UserInput(Scanner keyboard){
    
           this.keyboard = keyboard;
        }
    
        public String getName() throws InvalidNameException{
            System.out.print("Please enter a name: ");
            String newName = keyboard.nextLine();
            if(/*some bad condition*/){
                throw new InvalidNameException();
            }else{
                return newName;
            }
        }
    }
    

    然后你的主要方法会做这样的事情:

     UserInput inputReader = new UserInput(new Scanner(System.in));
     String name;
     try{
         name = inputReader.getName();
     }
     catch(InvalidNameException e){
         //do some thing with e
     }
    

    在这里,您将抛出异常的方法包装在 try catch 块中,并捕获各种不同类型的异常。希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 2019-02-27
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多