2009-07-23 76 views
2

所以我给了这段代码,我必须创建一个例外,然后使用Try/Catch块来捕获它。我已经在代码的底部创建了Exception。但我从来没有使用过Try/Catch Block,我不知道如何实现它。尝试使用Java中的捕获块

例外是,如果输入了未在enum下列出的等级。我还需要使用toString以及发生异常的情况,但我很确定我能确定这一点。

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: "); 

     } 
    } 
} 
+0

是排名指的是标题枚举? – Victor 2009-07-24 00:01:29

回答

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 
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 
} 
5

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

更新:一点代码审查是一个命令在这里。

  1. 您的默认构造函数很奇怪。你可以成为没有姓名或工资的部门主管?在这里调用“this”是合适的,更好的默认值是按顺序排列的。
  2. 仅用于工资的整数 - 确定。没有单位?美元?欧元?
  3. 薪水可否为负?那有意义吗? (注意自己:不要在那里工作。)
  4. 为什么你需要同时使用toString和display?什么是显示覆盖?我建议放弃显示并粘贴toString。
  5. 您的输入法毫无意义。
  6. 为什么这个异常是内部类?
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 
    } 
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不测试什么导致它开火。