1

i have written a program to convert character a,g,t,c from a textbox to another value the problem is that when several values apart from a,g,t,c it displays an error message for each invalid character.how can i do it such that on the first invalid character it sees it stop the conversion method.Below are my codes.Thank you

private void dna2rna() {
   String DNA = dna_ta.getText();
   char[]readdna;
   readdna=DNA.toCharArray();
   for (int x=0;x<readdna.length;x++){
      switch(DNA.charAt(x))
      {
         case 'A': readdna[x] = 'U';break;
         case 'T': readdna[x] = 'A';break;
         case 'C': readdna[x] = 'G';break;
         case 'G': readdna[x] = 'C';break;
         case 'a': readdna[x] = 'u';break;
         case 't': readdna[x] = 'a';break;
         case 'c': readdna[x] = 'g';break;
         case 'g':readdna[x] = 'c';break;
         default:
            JOptionPane.showMessageDialog(frame,
               "Not a DNA Sequence.Please Retry",
               "Sequence error",
               JOptionPane.ERROR_MESSAGE);
            dna_ta.setText("");
            rna_ta.setText(""); 
            break;
      }
      String rna= new String(readdna);
      rna_ta.setText(rna);
   }
}

the problem is if it finds the the default case it goes out and continue the for loop .how to prevent it from going through the for loop.

2
  • 3
    Not my type of business but whoever downvoted this should explain why. Commented Nov 18, 2012 at 8:08
  • @Cummander Checkov, I did not downvoted this, but maybe someone did it because of unformatted code that is not compilable. Commented Nov 18, 2012 at 8:25

3 Answers 3

2

You can use a flag to signal the for loop to exit:

private void dna2rna() {
   String DNA = dna_ta.getText();
   char[]readdna;
   readdna=DNA.toCharArray();
   boolean error = false;
   for (int x=0;x<readdna.length && !error;x++){

      switch(DNA.charAt(x))
      {
        case 'A': readdna[x] = 'U';break;
        case 'T': readdna[x] = 'A';break;
        case 'C': readdna[x] = 'G';break;
        case 'G': readdna[x] = 'C';break;
        case 'a': readdna[x] = 'u';break;
        case 't': readdna[x] = 'a';break;
        case 'c': readdna[x] = 'g';break;
        case 'g':readdna[x] = 'c';break;
        default:
            JOptionPane.showMessageDialog(frame,"Not a DNA Sequence.Please   Retry","Sequence error",JOptionPane.ERROR_MESSAGE);
            dna_ta.setText("");
            rna_ta.setText("");
            error = true;
            break; // or possibly: continue;
      }
      String rna= new String(readdna);
      rna_ta.setText(rna);
   }
}
Sign up to request clarification or add additional context in comments.

Comments

2

add a label to the loop, use break wiith this label. kind of goto style, but it works...

private void dna2rna() {
    String DNA = dna_ta.getText();
    char[]readdna;
    readdna=DNA.toCharArray();
    forLoop: // <----------- label
    for (int x=0;x<readdna.length;x++){

         switch(DNA.charAt(x))
         {
             case 'A': readdna[x] = 'U';break;
             case 'T': readdna[x] = 'A';break;
             case 'C': readdna[x] = 'G';break;
             case 'G': readdna[x] = 'C';break;
             case 'a': readdna[x] = 'u';break;
             case 't': readdna[x] = 'a';break;
             case 'c': readdna[x] = 'g';break;
             case 'g':readdna[x] = 'c';break;
             default:
                 JOptionPane.showMessageDialog(frame,"Not a DNA Sequence.Please   Retry","Sequence error",JOptionPane.ERROR_MESSAGE);
                dna_ta.setText("");
                 rna_ta.setText(""); break forLoop; // <----------- break to label
         }
         String rna= new String(readdna);
         rna_ta.setText(rna);
    }

}

simple method for testing:

private static void dna2rna() {
    char[] readdna = { 'A', 'T', 'W', 'C', 'T', };
    forLoop: for (int x = 0; x < readdna.length; x++) {

        System.out.println("reading: " + readdna[x]);
        switch (readdna[x]) {
             case 'A': readdna[x] = 'U';break;
             case 'T': readdna[x] = 'A';break;
             case 'C': readdna[x] = 'G';break;
        default:
            System.out.println("some weird value!");
            break forLoop;
        }
    }

}

output:

reading: A
reading: T
reading: W
some weird value! breaking!

Comments

2

You could change your default option to return instead of break. You could also make it throw an IllegalArgumentException (or any other Exception you prefer) then handle it in the calling method:

default:
    throw new IllegalArgumentException("Not a DNA Sequence");

Then in the caller:

try {
    dna2rna();
} catch (IllegalArgumentException e) {
    JOptionPane.showMessageDialog(frame,"Not a DNA Sequence.Please   Retry","Sequence error",JOptionPane.ERROR_MESSAGE);
    dna_ta.setText("");
    rna_ta.setText("");
    // Whatever else you were doing when error==true.
}

2 Comments

I like that answer. It's a step towards loose coupling. Moreover dna2rna() should not return void but String with text for rna_ta.setText(returnedRna);, that way handling data presentation (View) is not that tight coupled with logic computing that data
Ah, and btw. forgot to add to my previous comment (@Prity Akhal read it please;) ): change this dna2rna(); to: dna2rna(dna_ta.getText()); so private static void dna2rna() {(...)} will become: private static void dna2rna(String dna) :)