如何在同一方法中抛出两个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;
}
答案 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库中的Preconditions。checkNotNull()来简化检查。
答案 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);
或者更清楚地指定类不变量并确保rank
和suit
永远不会null
(例如,检查构造函数,并验证rank
和{{1}有固定器)。