2016-03-31 2 views
-1

Это фрагмент кода. Я уже исправил эту ошибку, но я просто не понимаю, почему она работает сейчас. Я не уверен, правильно ли объяснил это, поэтому, если необходимо, задайте любой вопрос. Ошибка заключается в том, что переменная puncation изменяется на правильное значение test, когда оператор находится в том месте, где я прокомментировал это заявление. Но это не сработает, когда оператор находится в том месте, где я прокомментировал, заявление не работает.Путаница с переменной областью для этой конкретной программы

 if (endOfSen) { 
       /////////////////The statement below works when it is here.///////////// 
       /////////////////OUTPUT 1 - occurs when the statement is placed here.    
       String puncation = null ; 
       ///////////////////// 
       int orgSize = words.size(); //remember size of stack 
       //only runs if stack is not empty 
       if (!words.empty()) { 
        while (words.size() > 0) {  //until last word 
         String word = words.pop(); 
         ///The statement below does not work when it is here/////// 
         //////OUTPUT 2- occurs when the statement is placed here. 
         //String puncation = null ; 

         //if last word of sentence 
         if (orgSize == words.size() + 1) { 
          word = word.substring(0, 1).toUpperCase() + word.substring(1); 
          puncation = "test";  // just a test value 
          word = word.replace(puncation, ""); 
          //////////////////test to see if works 
          System.out.println("puncation: " + puncation); 
         } 
         //if first word of sentence 
         if (words.size() == 0) { 
          //////////////////test to see if works 
          System.out.println("puncation: " + puncation); 
          word = word.toLowerCase(); 
          word = word + "" + puncation; 
         } 
         newSen.push(word); 
        } 
       } 
       endOfSen = false; 
      } 
     } 

В 1 (Второй puncation изменяется от исходного значения)

puncation: test 
puncation: test 

Выхода 2 (Второй puncation не меняется от исходного значения)

puncation: test 
puncation: null 
+0

какая ошибка? Что вы изменили? – TinyTheBrontosaurus

+0

укажите, когда возникает выход 1 и когда возникает выход 2 –

+0

@TinyTheBrontosaurus Я сделал редактирование, не уверен, помогло ли оно. – name

ответ

1

Если переменный объявляется внутри цикла, тогда каждая итерация цикла увидит di fferent переменная. Кроме того, вы даже инициализируете его нулевым, когда есть, поэтому каждая итерация начинается с нулевого значения.

При объявлении нуля за пределами цикла переменная будет сохранять значение из предыдущей итерации цикла.

Поскольку orgSize никогда не изменяется в цикле, и words уменьшается на единицу каждой итерации первого if оператор может только когда-либо быть верным на первой итерации. Второй оператор if может быть правдой только на последней итерации.

Так что если puncation инициализируется нулем внутри цикла, единственный раз, когда он может быть не равно нулю во втором if заявление было бы, если первоначально words имел размер 1.

Простая отладка могла бы показать вам все это.

+0

Черт возьми, кажется, сейчас так очевидно. И правда, я должен был просто написать, что делает программа, и я бы увидел, что происходит. Хорошо, спасибо за вашу помощь. – name

1

Это не так много проблем, поскольку это просто, что переменная сбрасывается в цикле. Я привел пример ниже, который более явственен о сбросе значения.

if (endOfSen) { 

     /////////////////The statement below works when it is here.///////////// 
     /////////////////OUTPUT 1 ////////////////// 
     String puncation = null ; 
     ///////////////////// 
     int orgSize = words.size(); //remember size of stack 
     //only runs if stack is not empty 
     if (!words.empty()) { 
      while (words.size() > 0) {  //until last word 
       String word = words.pop(); 
       ///The statement below does not work when it is here/////// 
       /////////////////OUTPUT 2 ////////////////// 

       // Puncation is beign reset here, each iteration of the loop 
       puncation = null ; 

       //if last word of sentence 
       if (orgSize == words.size() + 1) { 
        word = word.substring(0, 1).toUpperCase() + word.substring(1); 
        puncation = "test";  // just a test value 
        word = word.replace(puncation, ""); 
        //////////////////test to see if works 
        System.out.println("puncation: " + puncation); 
       } 
       //if first word of sentence 
       if (words.size() == 0) { 
        //////////////////test to see if works 
        System.out.println("puncation: " + puncation); 
        word = word.toLowerCase(); 
        word = word + "" + puncation; 
       } 
       newSen.push(word); 
      } 
     } 
     endOfSen = false; 
    } 
} 
+0

Не объясняет * почему *. – Andreas

+0

Как я уже упоминал в другом комментарии, это кажется таким очевидным сейчас. Спасибо за ваш ответ. – name

Смежные вопросы