2009-07-23 3 views
2

Так что мне дан этот код, и мне нужно создать исключение, а затем использовать блок Try/Catch, чтобы его поймать. Я уже сделал исключение в нижней части кода. Но я никогда раньше не использовал блок Try/Catch и не знаю, как его реализовать.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

- ранг, относящийся к названию enum? – Victor

+0

Да, извините за путаницу – Tyler

+1

'Enum.valueOf (Title.class, in.next())' должен быть записан как 'Title.valueOf (in.next())' – user102008

ответ

2

Не совсем уверен, что вы пытаетесь сделать, но попробовать-уловах блоки работают так:

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. Ваш конструктор по умолчанию довольно нечетный. Вы можете быть руководителем отдела без имени или зарплаты? Призыв к «этому» здесь подходит, и лучшие значения по умолчанию в порядке.
  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/поймать окружающую этот призыв.


    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. Enum не будет возвращать неверный ранг/название
  2. InvalidRankException не проверяет ни на что, чтобы вызвать его на огонь.
Смежные вопросы