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

您不能像下面的代码那样抛出异常类:-

throw InvalidValueException;

你必须为你的异常创建一个新实例,然后抛出它: -

throw new InvalidValueException();

但是,您的代码中仍然存在一些逻辑问题。你已经声明你Exception是 throws,但同时,你在catch块本身中处理它。为什么要这么做?

更新: -

根据您修改后的帖子: -

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

       message = "Invalid Triangle";

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

由于您无处可在您try block的 Exception 中抛出任何异常,因此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 块重新抛出您的自定义。

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

看起来像是InvalidValueException一个已检查的异常(编译时异常),并且您在 catch 块中的代码不会引发该异常。

您可以通过首先检查方法中的值并在其中任何一个无效时立即抛出异常来克服该错误消息(以有意义的方式)。

或者,如果可能,您也可以将其RuntimeException改为 a。

于 2012-10-14T08:33:26.437 回答