如何在 Java 中抛出一般异常?

How can I throw a general exception in Java?

提问人:Richard Knop 提问时间:8/4/2011 最后编辑:Peter MortensenRichard Knop 更新时间:9/1/2020 访问量:245439

问:

考虑这个简单的程序。该程序有两个文件:

文件Vehicle.java

class Vehicle {
    private int speed = 0;
    private int maxSpeed = 100;

    public int getSpeed()
    {
        return speed;
    }

    public int getMaxSpeed()
    {
        return maxSpeed;
    }

    public void speedUp(int increment)
    {
        if(speed + increment > maxSpeed){
            // Throw exception
        }else{
            speed += increment;
        }
    }

    public void speedDown(int decrement)
    {
        if(speed - decrement < 0){
            // Throw exception
        }else{
            speed -= decrement;
        }
    }
}

文件HelloWorld.java

public class HelloWorld {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Vehicle v1 = new Vehicle();
        Vehicle v2 = new Vehicle();

            // Do something

            // Print something useful, TODO
        System.out.println(v1.getSpeed());
    }

}

正如你在第一堂课中看到的,我添加了一个注释(“// throw exception”),我想在其中抛出一个异常。我是否必须为异常定义自己的类,或者 Java 中是否有一些通用的异常类可以使用?

Java 异常

评论

4赞 dlev 8/4/2011
您可以考虑根本不抛出异常,而只是将速度设置为零/最大值。为什么要惩罚来电者不知道汽车到底有多快才能停下来/加速?
3赞 SLaks 8/4/2011
请考虑重命名为 。speedDownslowDown
0赞 Vlad 8/4/2011
@dlev:同意,但这是代码设计的问题。您建议的行为与正常的汽车行为相匹配:加速以限制最高速度并减速至完全停止。
0赞 Mitselplik 12/14/2015
我有 C# 背景,我和 Richard 有同样的问题,到目前为止,似乎没有一个回答能清楚地回答这个问题。在 C# 中,不必从 Exception 派生新类。例如,您可以简单地“抛出新的 Exception(message);”,并在捕获异常的块中通用地处理它。我仍在开发我的第一个 Java 应用程序:-)但从文档中的内容来看,Java 在异常方面几乎相同。

答:

13赞 RMT 8/4/2011 #1

好吧,有很多异常可以抛出,但以下是抛出异常的方法:

throw new IllegalArgumentException("INVALID");

此外,是的,您可以创建自己的自定义例外。

关于异常的说明。当您抛出异常(如上所述)并捕获异常时:可以访问您在异常中提供的异常,请抛出该方法。StringgetMessage()

try{
    methodThatThrowsException();
}catch(IllegalArgumentException e)
{
  e.getMessage();
}

评论

1赞 Vlad 8/4/2011
为什么这个论点是非法的?是否有任何参数值检查?事实上,国家不是非法的,所以他应该抛出一个 IllegalStateException?(speed < 0)
0赞 RMT 8/4/2011
好吧,对象的“状态”不是非法的,通过的论点是非法的。(在这种情况下,递减变量是非法的,因为它大于速度本身)
1赞 Vlad 8/4/2011
但是,您检查的是最终状态,而不是参数的值。这是误导。如果在打电话之前怎么办?speed == 0speedDown
1赞 Fortega 8/10/2011
我同意弗拉德的观点。仅当参数本身不正确时,才应引发 IllegalArgumentException。这应该与对象的状态无关。但马克也是对的,它也不是 IllegalStateException......
1赞 RMT 8/10/2011
@Fortega在这种情况下,如果您不想创建自己的,恕我直言,我会说这是最好的选择。
4赞 SLaks 8/4/2011 #2

Java 针对不同的场景提供了大量的内置异常。

在这种情况下,应引发 IllegalArgumentException,因为问题在于调用方传递了错误的参数。

评论

5赞 Fortega 8/4/2011
IllegalArgumentException 应仅在参数不合适的情况下抛出,而不应在适当的参数导致某处溢出时抛出。因此,如果出现否定参数,我会抛出一个 IllegalArgumentException,并在超过最大速度时抛出自定义异常。
44赞 Maurício Linhares 8/4/2011 #3

可以使用 IllegalArgumentException:

public void speedDown(int decrement)
{
    if(speed - decrement < 0){
        throw new IllegalArgumentException("Final speed can not be less than zero");
    }else{
        speed -= decrement;
    }
}

评论

1赞 Vlad 8/4/2011
请参阅我对之前类似答案的评论。另外,请注意使用 s,因为抛出方法不会声明它们。RuntimeException
0赞 Peter Mortensen 9/1/2020
直接链接到弗拉德的评论(到问题)。
8赞 Vlad 8/4/2011 #4

这实际上取决于您在捕获该异常后要对它做什么。如果您需要区分您的异常,那么您必须创建您的自定义 .否则,你可以只是Exceptionthrow new Exception("message goes here");

评论

2赞 Mark Peters 8/4/2011
Exception已选中。我不确定这在这里是否富有成效。
0赞 Vlad 8/4/2011
如何提高生产力RuntimeException
1赞 Mark Peters 8/4/2011
它不会使调用方处理表示编程错误的异常。
1赞 omnomnom 8/4/2011 #5

您可以定义自己的异常类来扩展 java.lang.Exception(这是针对已检查的异常 - 必须捕获的异常),或扩展 java.lang.RuntimeException - 不必捕获这些异常。

另一种解决方案是查看Java API并找到一个描述您的情况的适当异常:在这种特殊情况下,我认为最好的例外是。IllegalArgumentException

105赞 Fortega 8/4/2011 #6

您可以创建自己的 Exception 类:

public class InvalidSpeedException extends Exception {

  public InvalidSpeedException(String message){
     super(message);
  }

}

在代码中:

throw new InvalidSpeedException("TOO HIGH");
1赞 Abimaran Kugathasan 8/4/2011 #7

这要视情况而定。您可以引发更一般的异常,也可以引发更具体的异常。对于更简单的方法,更一般的例外就足够了。如果方法很复杂,那么抛出更具体的异常将是可靠的。

6赞 Sudip Bhandari 11/30/2016 #8

最简单的方法是:

throw new java.lang.Exception();

但是,以下行在代码中无法访问。因此,我们有两种方法:


  1. 在方法底部引发泛型异常。
  2. 抛出自定义异常,以防您不想执行 1.