2010-01-28 4 views
2

J'écris une boucle qui se terminera lorsque le scanner recevra la valeur de chaîne "end". Cependant, lors d'un test avec une valeur "fin", la boucle continue. Logiquement si file = l'entrée, if (file == "end") est faux, même si j'ai tapé end! Y a-t-il des erreurs visibles dans mon code?Java Scanner entrée inégale à elle-même?

String file = ""; 
    Scanner in = new Scanner(System.in); 
    ArrayList<Integer> fileInput = new ArrayList<Integer>(); 

    while(file!="end") { 
     // Scan for filename/end program 
     System.out.println("Provide the name of a file in the \"bin/\" folder, i will assume it's .txt"); 
     file = in.nextLine(); 

     System.out.println("." + file + "."); 
     if(file!="end") { 
      file= "bin/" + file + ".txt"; 

      // start reading 
      try { 
       // If file found then carry on 
       BufferedReader openFile = new BufferedReader(new FileReader(file)); 
       fileInput = readIn(openFile); 
       int lowerBound = getLower(fileInput); 
       int upperBound = getUpper(fileInput); 

       System.out.println("Lower Bound: " + lowerBound); 
       System.out.println("Upper Bound: " + upperBound); 

       // file not found 
      } catch (FileNotFoundException e) { 
       System.out.println("File not found!"); 
      } 
     } 
    } 
    System.out.println("Goodbye!"); 
    System.exit(0); 

Répondre

5

En Java, vous devez utiliser .equals() pour l'égalité des cordes; sinon, il fait une comparaison de référence.

String s1 = "end"; 
String s2 = "end"; // different string in memory 
s1 == s2   // false: not the same string 
s1.equals(s2)  // true: have the same characters 
"end".equals(s1) // also true 
"end" == s1   // false 

Et oui, ça craint.

+0

il a '(! (File.equals (" end ")))' dans son code –

+1

En fait, tous les littéraux String sont internés, donc dans ce cas 's1 == s2' retournera true. – danben

+0

Ah c'est le problème. J'avais essayé le .equals mais je l'ai utilisé à tort! Je vous remercie. – Graeme

2

Je pense que votre problème est ici:

if(file!=file2) { 
    file= "bin/" + file + ".txt"; 

Sauf si vous entrez « fin » deux fois, vous écrasez file avant le prochain chèque.

Aussi, je pense que vous voulez

if(!file.equals(file2)) { 
    file= "bin/" + file + ".txt"; 

Modifier: en réponse à votre commentaire, changer == "end"-.equals("end") devrait le faire.

+0

Désolé, je vous ai donné le mauvais code. Le code avec lequel je travaille actuellement est au dessus. Cette ligne devrait juste être file! = "End". même chose avec l'instruction while. – Graeme

+0

Même à cela, vous devriez avoir 'if (! File.equals (" end "))' –