1

ここでの問題は何ですか?コンストラクターのifステートメント、コード全体に応じて、カスタム例外をキャッチしようとしているだけです。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package question3_test;

/**
 *
 * @author jackandjill
 */
public class Triangle2 
{
    private int side1, side2, side3;
    private  double area;
    private  String message;    

    public  int getSide1()
    {
        return side1;
    }

    public void setSide1(int s1)
    {
        side1 = s1;
    }

    public  int getSide2()
    {
        return side2;
    }

    public void setSide2(int s2)
    {
        side2 = s2;
    }

    public  int getSide3()
    {
        return side3;
    }

    public void setSide3(int s3)
    {
        side3 = s3;
    }

   public Triangle2(int a,int b,int c) throws InvalidValueException
   {
    setSide1(a);
    setSide2(b);
    setSide3(c);

    try
    {
         if (!(side1 + side2 > side3) && (side2 + side3 > side1)&& (side1 + side3 > side2))

                 throw new InvalidValueException("Invalid Value");
    }
    catch (InvalidValueException excep)
    {
        message = excep.getMessage();
        //throw new InvalidValueException(message);
    }

    public double findArea(int side_1, int side_2, int side_3)
    {
        int s, a, b,c;
        a = side_1;
        b = side_2;
        c = side_3;
        s = ((a + b + c)/2);
        area = Math.sqrt(s*(s-a)*(s-b)*(s-c));
        //area =
        return area;
    }
   }
}

問題は私のcatchステートメントにあり、赤で下線が引かれ、対応するtryステートメントでスローされないことを示しています

4

4 に答える 4

2

次のコードのようにExceptionクラスをスローすることはできません。-

throw InvalidValueException;

例外の新しいインスタンスを作成してから、それをスローする必要があります。-

throw new InvalidValueException();

しかし、それでもコードにはいくつかの論理的な問題があります。あなたはExceptionスローを宣言しましたが、同時に、catchブロック自体でそれを処理しています。どうしてそうするか?

更新:-

変更された投稿によると:-

try
{
   if (!(side1 + side2 > side3) && (side2 + side3 > side1) && 
        (side1 + side3 > side2))

       message = "Invalid Triangle";

} catch (InvalidValueException e) {
    message = "Invalid Traingle";
}

あなたはどこにも例外を投げていないので、それtry blockについてcatch block文句を言うでしょう。

throw例外が必要な場合は、次のcatchように使用します。-

public Triangle2(int a,int b,int c) throws InvalidValueException

      if (!(side1 + side2 > side3) && (side2 + side3 > side1) && 
            (side1 + side3 > side2))

           throw new InvalidValueException("Invalid Value")
}

mainそして、メソッドからそれを使用していると仮定するとtry-catch、コンストラクターで宣言された例外を処理するために、そこにブロックが必要です。:-

public static void main(String[] args) {
    Triangle triangle = null;
    try {
         triangle = new Triangle(2, 3, 4);
    } catch (InvalidValueException e) {
        e.printStackTrace();
    }
}

メソッドでのみ例外を処理する場合は、メソッド宣言で宣言しないでください。ただし、処理しない場合は、スローされる例外を宣言する必要があります。

例外を処理するか、スローするように宣言する必要がありますこの場合、実際にその例外をスローする必要がありますが、両方をスローすることはできません。

例外の詳細については、このチュートリアルを参照してください。- http ://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

于 2012-10-14T08:25:52.473 に答える
2

例外の使用方法には、コードに混乱があります。

  1. ブロック内ではtry、例外をスローすることはありませんが、以下でキャッチしてみてください。
  2. メソッドが例外をスローすることを宣言しますが、メソッドの本体が例外をスローすることはありません。

public Triangle2(int a,int b,int c) 
throws InvalidValueException // declared, but never thrown!
{
  try
  {
    if (!(side1 + side2 > side3) && (side2 + side3 > side1)&& (side1 + side3 > side2))
      message = "Invalid Triangle";
  }
  catch (InvalidValueException excep)  // caaught, but never thrown in try body!
  {
    message = "Invalid Triangle";
  }
}

これはあなたがそれを書くべき方法であり、実際にははるかに簡単です:

public Triangle2(int a,int b,int c) throws InvalidValueException
{
  setSide1(a);
  setSide2(b);
  setSide3(c);
  if (!(side1 + side2 > side3) && (side2 + side3 > side1)&& (side1 + side3 > side2))
    throw new InvalidValueException("Invalid Triangle");
}

例外をスローしたのと同じコンテキストで例外をキャッチすることは想定されていません。コンストラクターを使用する場所new Triangle2(a,b,c)は、(最も賢明な)キャッチする場所です。

于 2012-10-14T08:29:01.923 に答える
0

exceptionキャッチブロックからカスタムを再スローする必要があります。

catch (InvalidValueException excep)
{
    message = "Invalid Triangle";
    throw new InvalidValueException(message);
}
于 2012-10-14T08:29:19.093 に答える
0

チェックされた例外(コンパイル時例外)のように見えInvalidValueException、catchブロック内のコードはその例外をスローしません。

最初にメソッドの値をチェックし、いずれかが有効でない場合はすぐに例外をスローすることで、そのエラーメッセージを(意味のある方法で)克服できます。

または、可能であれば、RuntimeException代わりに作成することもできます。

于 2012-10-14T08:33:26.437 に答える