是否可以为 customException 显示不同的超级(消息)?
Is it possible to have a different super(message) be displayed for a customException?
我有一个自定义异常 class InvalidNameException
如果输入字符串太短或有任何特殊字符,它应该处理错误。
我想知道是否可以根据输入名称满足的条件显示不同的super(message)
。
理想情况下应该是这样的,但是由于 super(message)
需要成为构造函数中的第一条消息,我很好奇这是否可以完成,或者我是否需要找到另一种方法来做到这一点。
customException class 看起来像这样
class InvalidNameException extends Exception
{
public InvalidNameException(String name) {
if(validName(name)){
super("Name Contains Special Characters");
}
else if(validLength(name)){
super("Name is too long");
}
}
public boolean validName(String name){
boolean check = true;
for (int i = 0; i < name.length(); i++) {
if (!Character.isLetter(name.charAt(i))
&& !Character.isWhitespace(name.charAt(i))) {
check = false;
}
}
return check;
}
public boolean validLength(String name){
boolean check = true;
if(name.length()<6) {
check = false;
}
return check;
}
}
你不能调用 super 两次。为了使这项工作有效,您必须像这样为每个条件抛出一个新的异常:
public InvalidNameException(String name) throws Exception {
if(validName(name)){
throw new Exception("Name Contains Special Characters");
}
else if(validLength(name)){
throw new Exception("Name is too long");
}
}
让我们回到开头说(我的评论不清楚,对此感到抱歉),您 可以 通过将方法定义为静态来获得不同的 super(message)
。
class InvalidNameException extends Exception {
public static InvalidNameException ofName(String name) {
if (validName(name)) {
return new InvalidNameException("Name Contains Special Characters");
}
if (validLength(name)) {
return new InvalidNameException("Name is too long");
}
return null;
}
private InvalidNameException(String message) {
super(message);
}
public static boolean validName(String name){
...
}
public static boolean validLength(String name){
...
}
}
然而,通过这样做,由于异常实例是有条件地生成的,您必须在调用函数时编写另一个验证。它的输出不够清晰,你很容易犯 NullPointerException
.
这样的错误
public void foobarMethod(String name) throws InvalidNameException {
InvalidNameException exception = InvalidNameException.ofName(name);
if (exception != null) {
throw exception;
}
}
另外,InvalidNameException
是定义错误,也是验证数据。这就是我说角色不明确的地方。
我的建议是在 class 中定义 setter 方法,它包含 name
(比如,Person
),因为存储和验证之间有更深层次的联系比异常定义。
class InvalidNameException extends Exception {
private final String name;
public String getName() {
return this.name;
}
private InvalidNameException(String name, String message) {
super(message);
this.name = name;
}
public static InvalidNameException invalidCharacter(String name) {
return new InvalidNameException(name, "Name Contains Special Characters");
}
public static InvalidNameException invalidLength(String name) {
return new InvalidNameException(name, "Name is too long");
}
}
class Person {
private String name;
public void setName(String name) throws InvalidNameException {
if (validName(name)) {
throw InvalidNameException.invalidCharacter(name);
}
if (validLength(name)) {
throw InvalidNameException.invalidLength(name);
}
this.name = name;
}
public static boolean validName(String name){
...
}
public static boolean validLength(String name){
...
}
}
class Foobar {
public void insertPerosn(String name) {
try {
Person person = new Person();
person.setName(name);
} catch (InvalidNameException e) {
System.out.println(e.getMessage());
System.out.println("Your input is: " + e.getName());
}
}
}
这个问题没有完美的答案,但至少这是我的看法。
我有一个自定义异常 class InvalidNameException
如果输入字符串太短或有任何特殊字符,它应该处理错误。
我想知道是否可以根据输入名称满足的条件显示不同的super(message)
。
理想情况下应该是这样的,但是由于 super(message)
需要成为构造函数中的第一条消息,我很好奇这是否可以完成,或者我是否需要找到另一种方法来做到这一点。
customException class 看起来像这样
class InvalidNameException extends Exception
{
public InvalidNameException(String name) {
if(validName(name)){
super("Name Contains Special Characters");
}
else if(validLength(name)){
super("Name is too long");
}
}
public boolean validName(String name){
boolean check = true;
for (int i = 0; i < name.length(); i++) {
if (!Character.isLetter(name.charAt(i))
&& !Character.isWhitespace(name.charAt(i))) {
check = false;
}
}
return check;
}
public boolean validLength(String name){
boolean check = true;
if(name.length()<6) {
check = false;
}
return check;
}
}
你不能调用 super 两次。为了使这项工作有效,您必须像这样为每个条件抛出一个新的异常:
public InvalidNameException(String name) throws Exception {
if(validName(name)){
throw new Exception("Name Contains Special Characters");
}
else if(validLength(name)){
throw new Exception("Name is too long");
}
}
让我们回到开头说(我的评论不清楚,对此感到抱歉),您 可以 通过将方法定义为静态来获得不同的 super(message)
。
class InvalidNameException extends Exception {
public static InvalidNameException ofName(String name) {
if (validName(name)) {
return new InvalidNameException("Name Contains Special Characters");
}
if (validLength(name)) {
return new InvalidNameException("Name is too long");
}
return null;
}
private InvalidNameException(String message) {
super(message);
}
public static boolean validName(String name){
...
}
public static boolean validLength(String name){
...
}
}
然而,通过这样做,由于异常实例是有条件地生成的,您必须在调用函数时编写另一个验证。它的输出不够清晰,你很容易犯 NullPointerException
.
public void foobarMethod(String name) throws InvalidNameException {
InvalidNameException exception = InvalidNameException.ofName(name);
if (exception != null) {
throw exception;
}
}
另外,InvalidNameException
是定义错误,也是验证数据。这就是我说角色不明确的地方。
我的建议是在 class 中定义 setter 方法,它包含 name
(比如,Person
),因为存储和验证之间有更深层次的联系比异常定义。
class InvalidNameException extends Exception {
private final String name;
public String getName() {
return this.name;
}
private InvalidNameException(String name, String message) {
super(message);
this.name = name;
}
public static InvalidNameException invalidCharacter(String name) {
return new InvalidNameException(name, "Name Contains Special Characters");
}
public static InvalidNameException invalidLength(String name) {
return new InvalidNameException(name, "Name is too long");
}
}
class Person {
private String name;
public void setName(String name) throws InvalidNameException {
if (validName(name)) {
throw InvalidNameException.invalidCharacter(name);
}
if (validLength(name)) {
throw InvalidNameException.invalidLength(name);
}
this.name = name;
}
public static boolean validName(String name){
...
}
public static boolean validLength(String name){
...
}
}
class Foobar {
public void insertPerosn(String name) {
try {
Person person = new Person();
person.setName(name);
} catch (InvalidNameException e) {
System.out.println(e.getMessage());
System.out.println("Your input is: " + e.getName());
}
}
}
这个问题没有完美的答案,但至少这是我的看法。