在toString方法中抛出两个NullPointerExceptions

时间:2014-03-07 02:19:30

标签: java exception throw

如何在同一方法中抛出两个NullPointerException? 这就是我现在所拥有的,但第二次投掷导致错误“无法访问的声明”

public String toString() {
    if (rank == null || suit == null) {
        throw new NullPointerException ("Rank cannot be null");
        throw new NullPointerException ("Suit cannot be null");
    }
    return rank + suit;
}

5 个答案:

答案 0 :(得分:7)

您不能一次抛出多个例外。此外,您不应该从toString()之类的方法抛出异常(相反,如果对象被无效构造,则在创建对象时抛出异常)。对于这样的事情,只是为遇到的第一个错误抛出异常。

构建此代码的更好方法是:

 public class Card {
    private final Rank rank;
    private final Suit suit;

    public Card(Rank rank, Suit suit) {
       this.rank = Preconditions.checkNotNull(rank);
       this.suit = Preconditions.checkNotNull(suit);
    }

    public String toString() {
      return "Card(rank=" + rank + ",suit=" + suit + ")";
    }
 }

在这里,我假设您使用Guava库中的PreconditionscheckNotNull()来简化检查。

答案 1 :(得分:2)

你不能这样做(考虑你的接收端看起来像什么!),但你可以说:

if (rank == null) throw new IllegalArgumentException("Rank cannot be null");
if (suit == null) throw new IllegalArgumentException("Suit cannot be null");

(请注意我使用IllegalArgumentException而不是NullPointerException - IllegalArgumentException更符合您希望实现的目标。如果您尝试在rank上调用方法,则会出现NullPointerException或suit,而不是在你故意检查其价值时。)

或者,您可以子类化异常:

public class RankException extends IllegalArgumentException

然后在你的try-catch块中,你可以这样做:

try {
  s = toString();
} catch (RankException e) {
  // do something with e
} catch (SuitException e) {
  // do something with e
}

答案 2 :(得分:1)

你不能一个接一个地抛出两个例外。一旦到达一个,程序将抛出异​​常,直到它被捕获到try catch或它到达JVM。 如果您想为不同的场景提供不同的消息......

public String toString() {
    if(rank == null) {
        throw new NullPointerException("Rank cannot be null");
    }
    if(suit == null) {
        throw new NullPointerException("Suit cannot be null");
    }
    return rank+suit;
 }

答案 3 :(得分:0)

当你throw异常时,它会立即离开你的方法(除非你以后用同样的方法捕获它)。如果你真的想把两条信息放在邮件中,你可以这样做:

public String toString() {
    if (rank == null || suit == null) {
        String message = "";
        if (rank == null)
            message = "Rank cannot be null";
        if (suit == null) {
            if (!message.isEmpty())
                message += ", ";
            message += "Suit cannot be null";
        }
        //throw new NullPointerException(message);
        throw new RuntimeException(message);  // this really isn't a NullPointerException
    }
    return rank + suit;
}

(PS我同意迈克尔toString不应该检查这个。如果这个条件无效,它应该被一个构造函数或其他可以设置rank或{的方法捕获{1}}。)

答案 4 :(得分:0)

你不能一次抛出两个例外。你会抓到什么?第二个是无法访问的代码,因为抛出异常将离开函数。

分别检查条件:

if (rank == null)
    throw new NullPointerException ("Rank cannot be null");
if (suit == null)
    throw new NullPointerException ("Suit cannot be null");

或者将它们结合起来:

if (rank == null || suit == null)
    throw new NullPointerException ("Rank or suit cannot be null");

或者在字符串中包含信息(通常不希望从toString()抛出异常:

return (rank == null ? "?" : rank) + (suit == null ? "?" : suit);

或者更清楚地指定类不变量并确保ranksuit永远不会null(例如,检查构造函数,并验证rank和{{1}有固定器)。