2017-02-24 14 views
-2

Ich bin noch neu in der Codierung und weiß nicht, warum ich diesen Fehler bekomme. Der Fehler verweist auf meinen Rückgabewert p in meiner makePokemon() -Methode. Ich habe versucht, meine p als Pokemon p; an verschiedenen Stellen meines Codes zu initialisieren, aber ich erhalte nur mehr Fehler, wie alle p-Werte vordefiniert sind. Ich kann nicht als Pokemon p = new Pokemon(); initialisieren, weil es eine abstrakte Klasse ist. Wenn Sie andere Fehler in meinem Code sehen, lassen Sie es mich wissen!Warum bekomme ich den Fehler, "Variable p wurde möglicherweise nicht initialisiert"

import java.util.*; 
//river program for Pokemon class 
public class PokeArray { 
    static final int SIZE = 6; 
    public static void main(String[] args){ 
     Scanner userIn = new Scanner(System.in); 
     String inString = new String(""); 
     boolean endLoop = false; 
     int counter = 0; 

     //Pokemon[] arrPokO = new Pokemon[SIZE]; 
     Pokemon p; 
     ArrayList<Pokemon> arrPokO = new ArrayList<>(); 

     //loop until stopping condition is given 
     while(endLoop != true){ 
     //menu text 
     System.out.println("Please enter the number of your choice:"); 
     System.out.println("1. Add a Pokemon"); 
     System.out.println("2. Print all Pokemon"); 
     System.out.println("0. Exit the program"); 
     System.out.print("What would you like to do? "); 

     //read in from user as a String -- much less errors can happen! 
     inString = userIn.nextLine(); 

     //take off any spaces on the string 
     inString = inString.trim(); 

     //just switch on the String no need to convert to int 
     switch(inString){ 
      case "0": endLoop = true; 
       System.out.println("Good bye!"); 
       break; 
      case "1": //do stuff to make a new Pokemon 
       arrPokO.add(counter%6, makePokemon()); //add in arraylist    
        //System.out.println("\n*****A new pokemon should get put into the array****\n"); 
       counter++; 
       break; 
      case "2": //print out all the Pokemon 
       PokeArray.printArray(arrPokO); 
        //System.out.println("\n****The array should be printed****\n"); 
       break; 
      default: //not a valid menu entry 
       System.out.println("\n****Invalid menu choice.****\nPlease enter a 0, 1, or 2\n"); 
       break;   
     } 
     } //close while lp 
    }//close main 

    public static Pokemon makePokemon(){ 
     Scanner userIn = new Scanner(System.in); 
     String name = ""; 
     String selPok = ""; //selected pokemon 
     String yN = ""; 
     Pokemon p;//initialize object 
     System.out.println("Which pokemon would you like to add?"); 
     System.out.println("Enter the corresponding number of the selected Pokemon:"); 
     System.out.println("1.Bulbasaur\n2.Ivysaur\n3.Venusaur\n4.Charmander\n5.Charmaleon\n6.Charizard\n7.Squirtle\n8.Wartortle\n9.Blastoise"); 

     try{ 
     selPok = userIn.nextLine().trim(); //user's choice of pokemon 
     System.out.println("Would you like to give the pokemon a name? Enter Y/N"); 
     yN = userIn.nextLine().trim(); 
     if(yN == "Y" || yN == "y"){ 
      System.out.println("What is the pokemon's name?"); 
      name = userIn.nextLine().trim(); 
      switch(selPok){ 
       case "1": 
        p = new Bulbasaur(name); 
        break; 
       case "2": 
        p = new Ivysaur(name); 
        break; 
       case "3": 
        p = new Venusaur(name); 
        break; 
       case "4": 
        p = new Charmander(name); 
        break; 
       case "5": 
        p = new Charmeleon(name); 
        break; 
       case "6": 
        p = new Charizard(name); 
        break; 
       case "7": 
        p = new Squirtle(name); 
        break; 
       case "8": 
        p = new Wartortle(name); 
        break; 
       case "9": 
        p = new Blastoise(name); 
        break; 
      } 
     }else{ 
      switch(selPok){ 
       case "1": 
        p = new Bulbasaur(); 
        break; 
       case "2": 
        p = new Ivysaur(); 
        break; 
       case "3": 
        p = new Venusaur(); 
        break; 
       case "4": 
        p = new Charmander(); 
        break; 
       case "5": 
        p = new Charmeleon(); 
        break; 
       case "6": 
        p = new Charizard(); 
        break; 
       case "7": 
        p = new Squirtle(); 
        break; 
       case "8": 
        p = new Wartortle(); 
        break; 
       case "9": 
        p = new Blastoise(); 
        break; 
      } 
     } 
     } 
     catch (NumberFormatException nfe){ 
     System.out.println("Please enter a corresponding number"); 
     } 
     return p; 
    }//close makePokemon 
+0

Sie können die Variable mit 'Pokemon p = null; initialisieren, wenn Sie sicher sind, dass sie neu zugewiesen wird, bevor Sie sie verwenden. – khelwood

+0

Denken Sie, was passiert, wenn der Benutzer nicht 1,2, ... 9, sondern, sagen wir, 0 oder 'a' eingibt. – avysk

+0

Es gibt mehrere Beispiele dafür, was das schon auf SO – ControlAltDel

Antwort

1
Pokemon p;//initialize object 

das Objekt nicht initialisieren Hat. Es erklärt eine Variable.

Dies macht den Variable mit einem instanzierte Objekt initialisieren:

Pokemon p = new Pokemon(); 

oder

Pokemon p = null;//initializes variable to null 

Das Problem ist, können Sie nie abhängig von der Logik des Codes der Variable initialisieren ...

Was ist, wenn keine Ihrer cases jemals erfüllt werden?

+0

10 verursacht Ich denke, Pokemon p = neues Pokemon() 'sollte instanziiert statt Initialisierung genannt werden. Wie OP sagte, er/sie ist neu in der Codierung, die Verwendung korrekter Begriffe hilft OP. – SkrewEverything

+0

@SkrewEverything Diese Zeile hat beides. – Tom

0

Wie bereits beantwortet, deklarieren Sie, nicht initialisiert. Auch warum es sich beschwert?

Da in Ihrem gesamten Code eine Verzweigung existiert, die Ihre p-Variable möglicherweise nicht initialisiert. Zum Beispiel: Was ist, wenn der Benutzer 10 eingibt? Jetzt sehen Sie die Verzweigung, Ihre Variable wird immer nicht initialisiert bleiben.

0

Da Sie nicht die Standardregel in den Switch-Anweisungen haben. Und die Kompilierung denkt, dass es vielleicht eine Situation gibt, in der selPok Ihre Fälle nicht befriedigen wird.

-1

Sie haben in Ihrer makePokemon-Klasse die Möglichkeit, p zurückzugeben, das nicht initialisiert ist. Überprüfen Sie Ihren ausgewählten Fall, sollte es einen Standard haben.

Verwandte Themen