2

所以我得到了这段代码,我必须创建一个异常,然后使用一个Try/Catch块来捕获它。我已经在代码底部创建了异常。但是我以前从未使用过Try/CatchBlock 并且不知道如何实现它。

例外情况是,如果输入了未在 下列出的排名enum。我还需要对toString捕获的异常使用 a ,但我很确定我可以解决这个问题。

package pracapp4;

import java.util.Scanner;

public class Staff extends Employee
{

  enum Title
  {
    DEPARTMENT_HEAD, DIRECTOR, DEAN, VICE_CHANCELLOR, CHANCELLOR
  }

  private Title title;

  public Staff()
  {
    super();
    title = Title.DEPARTMENT_HEAD;
  }

  public Staff(String firstName, String lastName, int salary, Title title)
  {
    super(firstName, lastName, salary);
    this.title = title;

  }

  @Override
  public String toString()
  {
    return super.toString() + "\n\tTitle: " + title;
  }


  @Override
  public void display()
  {

    System.out.println("<<Staff>>" + this);

  }

  @Override
  public void input(Scanner in)
  {
    super.input(in);

    if (in.hasNext())
    {
      this.title = Enum.valueOf(Title.class, in.next());
    }
  }

  class InvalidRankException extends Exception
  {
      public InvalidRankException()
      {
       super ("Unknown Rank Name: ");

      }   
  }
}
4

5 回答 5

5

你不需要那个例外。当您将 Title 枚举添加为传递给 Staff 构造函数的类型时,就不可能提供不在枚举中的值。你永远不会得到一个无效的标题。这就是枚举的全部意义所在。

更新:这里需要一点代码审查。

  1. 您的默认构造函数相当奇怪。你可以成为没有名字或薪水的部门主管吗?在这里调用“this”是合适的,并且更好的默认值是有序的。
  2. 仅用于薪水的整数 - 好的。没有单位?美元?欧元?
  3. 工资可以是负数吗?那有意义吗?(自我注意:不要在那里工作。)
  4. 为什么你需要 toString 和 display ?什么是显示覆盖?我建议放弃显示并坚持使用 toString。
  5. 你的输入法毫无意义。
  6. 为什么那个异常是一个内部类?
于 2009-07-24T00:03:39.443 回答
4

try/catch 用于捕获 try 子句中的方法抛出的异常。如果 try 中的方法没有抛出任何异常,那么 try/catch 将没有意义。现在你做了你的异常,但没有方法抛出你的异常。

这是有关如何使用异常的简单示例:



public class myTest
{

  public void myMethod() throws InvalidRankException
  {
     //Logic here
    if(something_is_wrong)
    {
        throw new InvalidRankException("Invalid Rank on myMethod due ...");
    } 

}

  class InvalidRankException extends Exception
  {
      public InvalidRankException()
      {
       super ("Unknown Rank Name: ");

      }   
  }

现在,每当您运行 MyTest.myMethod() 时,编译器都需要一个围绕该调用的 try/catch。


    MyTest test = new MyTest();
    try
    {
       test.myMethod();
    }
    catch(InvalidRankException ex)
    {
       //Something went wrong
    }
于 2009-07-24T00:06:52.700 回答
2

不完全确定您要做什么,但 try-catch 块的工作方式如下:

try{ 
    throw new Exception("Example exception");
}
catch(Exception e){
    System.out.println( "Exception caught: " + e.getMessage() );
}

您还必须修改您正在尝试的方法,以便它抛出您正在寻找的异常:

public void doSomething(String blah) throws Exception
于 2009-07-24T00:01:26.097 回答
2

捕获异常很简单:

try{
  //Some code that throws MyExceptionClass
}catch(MyException e){
  //Some code that handles the exception e
}

抛出异常很简单:

throw new MyException(some, parameters, of, your choice);

如果您的异常不是从 RuntimeException 下降的,那么您必须声明该方法抛出它:

public void myExceptionCausingMethod() throws MyException{
  //Method code
}
于 2009-07-24T00:02:58.090 回答
2

try/catch 语句包含一些代码,用于处理该代码中可能出现的错误和异常。

public void input(Scanner in) throws InvalidRankException {
  super.input(in);

  if (in.hasNext()) {
    try {     
      title = Enum.valueOf(Title.class, in.next());
    } catch(InvalidRankException ire) {
      //You've hit the exception, code in here how to handle the situation
    }
  }
}

这里有两个问题:

  1. 枚举不会返回无效的排名/头衔
  2. InvalidRankException 不会测试任何导致它触发的东西。
于 2009-07-24T00:08:19.420 回答