2017-06-13 166 views
1

在测试情况下,我也行未处理的异常 - 抛出不工作

ZahlPasstNicht zahlPasstNicht = new ZahlPasstNicht(min, max, ist); 

第二部分是强调了红色和它说:未处理的异常:ZahlPasstNicht

我可以使用尝试/ catch或让构造函数抛出一个错误,我试图做后者:

public class ZahlPasstNicht extends IndexOutOfBoundsException { 
    int a; 
    int b; 
    int c; 

    public ZahlPasstNicht(int a, int b, int c) throws ZahlPasstNicht { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
    } 

我在做什么错?

+1

这是一个奇怪的用例。抛出异常的可能性为零,异常类不应抛出异常。 –

+0

如果你在构造'ZahlPasstNicht'时设法导致'ZahlPasstNicht'类型的异常,我预见到一个无限循环......我曾经看到一个系统在记录导致它记录错误的错误时抛出一个错误。 。日志文件爆炸到50Gb。 – Persixty

+0

另外,抛出'throws RuntimeException'是一种糟糕的做法,其中'IndexOutOfBoundsException'是'RuntimeException'。未经检查的异常不需要“抛出”。只有把'throws'用于检查异常。 –

回答

0

没有什么错在提供的代码。从技术上讲,这是正确的,但不是逻辑上的。你可以看到它工作正常。 You can see working code here

注:ideone,我被允许的代码只有一个文件,所以ZahlPasstNicht类是不公开的在这里。

代码为逻辑上不正确因为:

  • 兹声明构造ZahlPasstNicht抛出ZahlPasstNicht但没有代码抛出ZahlPasstNicht类型的例外的ZahlPasstNicht构造。
  • 此外,如果在构造函数ZahlPasstNicht中抛出类型为ZahlPasstNicht的异常,则它将陷入无限循环。

该问题似乎在代码的任何其他部分。确保构造函数ZahlPasstNicht的参数是兼容的,即变量min,maxist的类型为int

1
public ZahlPasstNicht(int a, int b, int c) throws ZahlPasstNicht 

你的构造函数指定,它可以throw,但你把它称为try块之外因此例外是未处理的。

我不认为你需要在这种情况下的throw部分。

3

我想不出任何情况下,将throws子句放入异常类的构造函数中是有意义的,因为异常类在实例化时不应该抛出另一个异常(尤其不是自身) 。

只要写

public ZahlPasstNicht(int a, int b, int c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 

,通常,如果你不打算把它扔到你不会实例化一个异常类。

这并没有太大的意义:

ZahlPasstNicht zahlPasstNicht = new ZahlPasstNicht(min, max, ist); 

这并不:

throw new ZahlPasstNicht(min, max, ist);