构造函数抛出运行时异常

时间:2014-01-31 02:07:58

标签: java

我有一个构造函数,它接受一个字符串作为参数。每次传递给构造函数的字符串包含任何不是“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”的字符并抛出运行时异常,但我觉得它太繁琐和糟糕的编程风格。有人有什么想法吗?

6 个答案:

答案 0 :(得分: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));
  }
}

答案 1 :(得分: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错误)。 我将把所有这些留作练习。

答案 2 :(得分:1)

建议不要使用例外。定义枚举并传递它。

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

如果您愿意,可以将其设为DnaCode []。您可以控制输入并避免处理中断的控制流。抛出异常是相当昂贵的,并不是真正用作流量控制的方法。

答案 3 :(得分:0)

您可以通过manaully循环遍历字符并使用ifs或Set检查字母来提高代码效率。

但老实说,除非性能是一个问题,否则它是如此的好。非常明显且易于维护。

答案 4 :(得分: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;
    }



}

我也不会将该代码放在构造函数中,而是将其放在自己的方法中并从构造函数中调用。

答案 5 :(得分: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");
      }

}