2014-01-31 70 views
0

我有一個構造函數接受一個字符串作爲參數。我想在每次傳入構造函數的字符串中包含任何不是「A」,「C」,「G」或「T」的字符串時拋出運行時異常。目前,這是我的代碼是什麼樣子:構造函數拋出運行時異常

public DNAStrandNovice(String strand) { 
    passedStrand = strand; 
    if (passedStrand.contains("a") || passedStrand.contains("c") 
      || passedStrand.contains("g") || passedStrand.contains("t")) { 
     throw new RuntimeException("Illegal DNA strand"); 
    } else if (passedStrand.contains("1") || passedStrand.contains("2") 
      || passedStrand.contains("3") || passedStrand.contains("4") 
      || passedStrand.contains("5") || passedStrand.contains("6") 
      || passedStrand.contains("7") || passedStrand.contains("8") 
      || passedStrand.contains("9") || passedStrand.contains("0")) { 
     throw new RuntimeException("Illegal DNA Strand"); 
    } else if (passedStrand.contains(",") || passedStrand.contains(".") 
      || passedStrand.contains("?") || passedStrand.contains("/") 
      || passedStrand.contains("<") || passedStrand.contains(">")) { 
     throw new RuntimeException("Illegal DNA Strand"); 


    } 
    } 

我覺得這可能以更簡潔的方式來實現,但我不知道怎麼辦。現在我只是檢查每個不是大寫字母「A」,「C」,「G」或「T」的字符,並拋出一個運行時異常,但我覺得它太枯燥乏味,編程風格不好。有人有主意嗎?

+0

從構造函數中拋出異常不是一個好主意。請參閱http://stackoverflow.com/questions/1371369/can-constructors-throw-exceptions-in-java –

+0

這是一個家庭作業的任務。我們被告知要這樣做。 – user122947

+0

爲什麼在字符串*'contains' *時拋出異常*你想要什麼?只有當*不包含你想要的東西時,你不應該拋出異常嗎? – ADTC

回答

0

您可以通過遍歷字符並使用ifs或Set來檢查字母來使代碼稍微更有效。

但說實話,除非性能是一個問題,它是如此好。非常明顯且易於維護。

+0

我真的覺得這是一種非常低效的方式。它會從字面上接收60行代碼來檢查每個字符。我將如何設置循環,以便每次遇到不是「A」,「C」,「G」或「T」的字符時都會拋出錯誤? – user122947

+0

我推薦@Louis Wasserman的第二個例子。 –

2

檢查消極,而不是積極。

for (int i = 0; i < str.length(); i++) { 
    if (str.charAt(i) != 'A' && str.charAt(i) != 'C' 
     && str.charAt(i) != 'G' && str.charAt(i) != 'T') { 
    throw new IllegalArgumentException("Bad character " + str.charAt(i)); 
    } 
} 

...或者,甚至更短,

for (int i = 0; i < str.length(); i++) { 
    if (!"ACGT".contains(str.charAt(i))) { 
    throw new IllegalArgumentException("Bad character " + str.charAt(i)); 
    } 
} 
+0

如果鏈只包含「A」「G」和「C」字母,則第一個for循環將不起作用。它應該在遇到除「A」,「C」,「G」或「T」以外的任何其他情況時拋出異常。不過,我確實明白你的意思是通過消極的方式而不是積極的方式進行。 – user122947

+0

@ user122947:我沒有關注。那麼如果該股只包含「A」「G」和「C」字母呢?你的問題陳述似乎暗示這是一個允許的輸入。 (假設這意味着類似於遺傳學中的問題,那也將是一個有效的解釋。) –

+0

Ahhhhhh,我很抱歉Louis。我只是通讀並檢查了代碼,它確實解決了我的問題。我現在看到它。對不起,你在那裏感到困惑。非常感謝你的幫助。 – user122947

0

我會的可能性,以跳...

public boolean validateLetter(String letter){ 
    HashMap<String, String> dna = new HashMap<String, String>(); 
    dna.put("A", "A"); 
    dna.put("C", "C"); 
    dna.put("G", "G"); 
    dna.put("T", "T"); 


    if(dna.get(letter) == null){ 
     System.out.println("fail"); 
     return false; 
    } else { 
     return true; 
    } 



} 

我也不會把這些代碼在構造函數,而是把它放在它自己的方法中,並從構造函數中調用。

2

可以實現這一點使用正則表達式(正則表達式)

public DNAStrandNovice(String strand) { 
    if (!strand.matches("[ACGT]+")) { //or [ACGT] <-- see note below 
     throw new RuntimeException("Illegal DNA strand"); 
    } 
    passedStrand = strand; 
} 

正則表達式[ACGT]+表示字符串必須具有一個或多個字符,並且它們中的每必須是A的一個, C,G或T. !前面的strand.matches反轉返回的布爾值matches,本質上意思是如果字符串不匹配正則表達式,則拋出RuntimeException

注:如果你需要的字符串有恰好一個字符,使用正則表達式[ACGT]。如果您需要允許空格,您可以使用[ACGT ]+(然後修剪並檢查是否爲空)或[ACGT][ACGT ]+(確保第一個字符不是空格)。

你甚至可以做更復雜和強大正則表達式檢查,如應包含在之間(例如ATCG TACG)用空格重複正好四個大字,甚至只有某些字符出現在某些地方,比如只有A模式和C可以顯示爲前兩個字符,並且只有G和T出現在其後面(例如ACTG正確,而AGTC錯誤)。 我會把所有這些都當作練習。

1

建議不要使用異常。定義一個枚舉並通過它。

public enum DnaCode { A, C, G, T } 
... 
public DNAStrandNovice(List<DnaCode> strand) { 
... 
} 

或者如果您願意,可以將其設爲DnaCode []。您可以控制輸入並避免處理中斷的控制流。拋出異常是相當昂貴的,並不是真正用作流量控制的方法。

0
public DNAStrandNovice(String strand){ 

    if(strand.matches("^[A-Za-z]*[0-9]+[A-Za-z]*$") || strand.matches("^[a-zA-Z]*[^a-zA-Z0-9][a-zA-Z]*$") || strand.matches("^[A-Za-z]*[acgt]+[A-Za-z]*$")){ 

        throw new RuntimeException("Illegal DNA strand"); 
     } 

} 
相關問題