InvalidNameException如果輸入字串太短或有任何特殊字符,我有一個自定義例外類應該處理錯誤。
我想知道是否可以super(message)根據輸入名稱滿足的條件顯示不同的內容。
理想情況下它應該看起來像這樣,但由于super(message)需要成為建構式中的第一條訊息,我很想知道這是否可以完成,或者我是否需要找到另一種方法來實作這一點。
customException 類看起來像這樣
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;
}
}
uj5u.com熱心網友回復:
你不能叫 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");
}
}
uj5u.com熱心網友回復:
讓我們回到開頭說(我的評論不清楚,對此感到抱歉),您可以通過將方法定義為靜態來獲得不同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定義錯誤但也驗證資料。這就是我所說的角色變得不清楚的地方。
我的建議是在包含name(例如Person)的類中定義 setter 方法,因為存盤和驗證之間的聯系比例外定義更深。
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());
}
}
}
對此沒有完美的答案,但至少這是我的看法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/481340.html
