2

したがって、このコードが与えられたので、例外を作成し、Try/Catchブロックを使用してそれをキャッチする必要があります。コードの下部で、既に例外を作成しました。しかし、これまでTry/Catchブロックを使用したことがなく、実装方法がわかりません。

例外は、下にリストされていないランクenumが入力された場合です。キャッチされた例外でもa を使用する必要がありますが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: ");

      }   
  }
}
4

5 に答える 5

5

その例外は必要ありません。Title 列挙型を Staff コンストラクターに渡す型として追加した時点で、列挙型にない値を提供することはできません。無効なタイトルを取得することはありません。それが列挙型の要点です。

更新: ちょっとしたコード レビューはここでの注文です。

  1. デフォルトのコンストラクターはかなり奇妙です。名前も給料もなしに課長になれる?ここでは「this」の呼び出しが適切であり、より適切なデフォルト値が用意されています。
  2. 給与のみの整数 - OK。単位がない?米ドル?ユーロ?
  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 ステートメントはいくつかのコードを囲み、そのコードで発生する可能性のあるエラーと例外を処理するために使用されます。

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

ここには 2 つの問題があります。

  1. Enum は無効なランク/タイトルを返さない
  2. InvalidRankException は、発火の原因となるものをテストしません。
于 2009-07-24T00:08:19.420 に答える
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 に答える