当前位置: 首页 > 知识库问答 >
问题:

为什么Java方法不会在测试类中引发异常?

郑功
2023-03-14

为什么我不能在Mammal对象中抛出异常,并在创建该对象的Test类中捕获它?

    package animals;
    public class Mammal extends Animal{
      public final boolean predation, herbivory;
      public String hairColor;

      public Mammal() {
        super();
        this.predation = rand.nextBoolean();
        this.herbivory = rand.nextBoolean();
        this.hairColor = colors[rand.nextInt(8)];
      }

      public Mammal(boolean predation, boolean herbivory, String hairColor) {
        super();
        this.predation = predation;
        this.herbivory = herbivory;
        this.hairColor = hairColor;
      }
      public Mammal(boolean predation, boolean herbivory, String hairColor, String name, boolean sex) {
        super(name, sex);
        this.predation = predation;
        this.herbivory = herbivory;
        this.hairColor = hairColor;
      }

      public void takeDamage(int damage) throws TakeDamageException{
        if(damage < 1) {
          throw new TakeDamageException("Damage cant be negative!");
        }
        else this.health -= damage;
      }

我试图捕获由teDamage方法抛出的异常,但我得到:异常TakeDamageException永远不会抛出在相应的try语句的正文中

和:未报告的异常TakeDamageException;必须被捕获或声明为抛出mammal.take损害(-123);

 import animals.*;

    public class Test extends Mammal {

      public static void main(String[] args){
        Mammal mammal = new Mammal();
        System.out.println(mammal.doDamage());
        System.out.println(mammal.getEnergy());
        try {
           mammal.takeDamage(-123);
        }
         catch(TakeDamageException e) {
           System.out.println("Couldnt take damage:" + e);
        }
      }
    }

将我的异常类定义为:

public class TakeDamageException extends Exception {
  public TakeDamageException(String message)  {
    super(message);
  }
  public TakeDamageException() {
  }
}

共有2个答案

农波涛
2023-03-14

您可能有一个潜在的问题:从静态上下文引用非静态方法akeDamage(int)。即使您在Mammal的子类中工作,您也需要引用它的实例才能使用该方法。

钱志
2023-03-14

一个更简洁的例子很好。我不同意测试应该继承自哺乳动物,但在我的例子中保留了它:

哺乳动物.java:

public class Mammal {
int health =500;
  public void takeDamage(int damage) throws Exception{
    if(damage < 1) {
      throw new Exception("Damage cant be negative!");
    }
    else this.health -= damage;
  }

}

Test.java:

public class MTest extends Mammal {
public static void main(String args[]) {
    Mammal m = new Mammal();
    try {
        m.takeDamage(-100);
    } catch(Exception e) {
        System.out.println("Exception");
    }
}

}

你可能一次做的太多了。婴儿步。

 类似资料:
  • 问题内容: 我有一个带有返回类型的方法。它还可以引发许多异常,因此我想测试所引发的异常。所有尝试均以相同的原因失败: Stubber类型中的when(T)方法不适用于参数(void) 有什么想法可以获取引发指定异常的方法吗? 问题答案: 括号放置不正确。 您需要使用: 而 不是 使用: 在文档中对此进行了解释

  • 问题内容: 因此,我知道IEEE 754为不是实数的值指定了一些特殊的浮点值。在Java中,铸造这些值的原始不会 不 抛出异常像我本来期望。相反,我们有以下内容: 在这些情况下 不 抛出异常的理由是什么?这是IEEE标准,还是Java设计者的选择?我是否不知道有这样的强制转换是否可能导致异常后果? 问题答案: 在这些情况下不抛出异常的理由是什么? 我认为原因包括: 这些都是极端情况,在执行此类操作

  • 为什么这段代码不抛出?看一看: 我不知道!

  • 我有一个返回类型为的方法。它还可以抛出许多异常,所以我想测试一下那些被抛出的异常。所有尝试都失败了,原因相同: 类型Stubber中的(T)不适用于参数(void)时的方法 有什么想法,我可以如何获得方法抛出一个指定的异常?

  • 最近,在一次代码审查中,一位同事说“测试不应该有try-catch块”。他还向我指出了关于的信息,我可以使用它重写对异常数据执行检查的一些测试。 然而,我遇到了一种情况,我不确定我是否能消除试捕。我正在为一个方法编写单元测试,该方法将抛出一个异常,并执行一些我需要使用JMockit验证的行为。假设测试中的代码包含如下内容 JUnit测试当前看起来像 我找不到摆脱试捕的好方法。就我个人而言,我不认为

  • 问题内容: 我正在使用JAXB XMLadapter来编组和解组布尔值。C#应用程序也将访问该应用程序的XML文件。我们必须验证此XML文件,这是使用XSD完成的。C#应用程序为布尔节点写入“ True”值。但是我们的XSD确实验证了同样的结果,因为它只允许“ true / false”或“ 1/0”。因此,我们在XSD中将String保留为布尔值,并且XMLAdapter会验证该字符串是否在我们