2014-09-22 3 views
0

Я получаю эту ошибку «variable "st" might not have been initialized» в случае 5, когда я пытаюсь выполнить подсчет строк. Я попытался найти онлайн решение, но не смог найти кого-то с той же проблемой, используя строковый токенизатор. Пожалуйста, может кто-нибудь сказать мне, почему это происходит?Java - переменная «st», возможно, не была инициализирована

/** 
*To change this license header,choose License Headers in Project Properties. 
*To change this template file,choose Tools|Templates 
*and open the template in the editor. 
*/ 

package labone; 

import java.util.Scanner; 
import java.util.StringTokenizer; 

public class LabOne { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

     Scanner userInput = new Scanner(System.in); 

     System.out.println("Welcome To The String Editor!"); 
     System.out.println(""); 
     System.out.println("Please choose what you would like to do by choosing one of the options below:"); 
     System.out.println("1. Input String"); 
     System.out.println("2. Print Current String"); 
     System.out.println(""); 
     int userOption = 0; 
     String stringInput = new String(); 

     while (userOption != 9) { 
      userOption = userInput.nextInt(); 
      userInput.nextLine(); 


      switch (userOption) { 
       case 1: 
        stringInput = userInput.nextLine(); 
        System.out.println(stringInput); 
        break; 

       case 2: 
        System.out.println(stringInput); 
        break; 

       case 3: 
        stringInput = new StringBuilder(stringInput).reverse().toString(); 
        System.out.println(stringInput); 
        break; 

       case 4: 
        StringTokenizer st = new StringTokenizer(stringInput); 
        System.out.println(stringInput); 
        break; 

       case 5: 
        System.out.println("Number of tokens:" + st.countTokens()); 
        break; 
       default: 
        ; 
        break; 
      } 

     } 

     // TODO code application logic here 
    } 

} 
+0

Как вы думаете, вы инициализируете 'st' для случая 5? И где вы используете 'st' в случае 4? Может быть, просто переместите его от случая 4 к случаю 5? – Thilo

+1

Пожалуйста, не просто удалите код из вопроса. –

ответ

3

Пожалуйста, может кто-нибудь сказать мне, почему это происходит?

Вы инициализировать st локально в случае 4. Не видно в случае 5.

Решение: инициализировать его вне блока переключателей.

В качестве альтернативы, как spotted by Thilo, вы можете инициализировать его в случае 5, поскольку он, похоже, не используется нигде.

case 5: 
     StringTokenizer st = new StringTokenizer(stringInput); 
     System.out.println("Number of tokens:" + st.countTokens()); 
     break; 

Вы должны быть осторожны, чтобы не инициализировать так много переменных локально, хотя вы можете повторить ту же проблему.

+2

или переместите его в корпус 5. Похоже, что кейс 4 ему совсем не нужен. – Thilo

+0

Хорошо различимый @Thilo –

0

Инициализировать StringTokenizer вне блока переключателей. Dont сделать это в случае 4.

0

Вы инициализировать ул в case4 но не в case5, Вы можете исправили таким образом.

StringTokenizer st; 
    switch (userOption) { 
     case 1: 
      stringInput = userInput.nextLine(); 
      System.out.println(stringInput); 
      break; 
     case 2: 
      System.out.println(stringInput); 
      break; 
     case 3: 
      stringInput = new StringBuilder(stringInput).reverse().toString(); 
      System.out.println(stringInput); 
      break; 
     case 4: 
      st = new StringTokenizer(stringInput); 
      System.out.println(stringInput); 
      break; 
     case 5: 
      st = new StringTokenizer(stringInput); 
      System.out.println("Number of tokens:" + st.countTokens()); 
      break; 
     default: 
       ; 
      break; 
     } 
0

объявить его глобально, объявить его за пределами блока переключателей, где вы объявляете свою всю переменную. Объявить его здесь,

int userOption = 0; 
String stringInput = new String(); 
StringTokenizer st; //add here 

так что ваш случай 4 будет

case 4: st = new StringTokenizer(stringInput); 
      System.out.println(stringInput); 
       break; 
0

вы инициализируетесь ули в случае 4, только тот случай, когда пользователь вводит опцию 5 до 4, в том случае, ули не инициализированное право. Таким образом, решение состоит в том, чтобы сначала инициализировать st либо в главном, а затем использовать его в определенных случаях коммутатора или инициализировать его для случая 5.

0
case 4: StringTokenizer st = new StringTokenizer(stringInput); 
       System.out.println(stringInput); 
       break; 

case 5: System.out.println("Number of tokens:" + st.countTokens()); 
       break; 

В случае коммутатора, переменный, й объявлен в случае 4 доступно в локально только для этого случая. Он не будет доступен за пределами корпуса. Если вам нужно получить к нему доступ, вам нужно объявить его за пределами блока переключателей.

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