2015-09-18 2 views
0

je reçois ceInteger.parseInt() Substring nouvelle chaîne et le rendre Int

Exception dans le thread "principal" java.lang.NullPointerException à SwedishPersonalNumber. (ScanPersonalNumber.java:5) à
ScanPersonalNumber.main (ScanPersonalNumber.java:54)

Mon combat renvoie le getYearBorn. Mais je ne sais pas ce que Im faire mal. Je peux résoudre getYearBorn avec de la ficelle mais c'est un exercice donc J'ai besoin qu'il soit int.

import java.util.Scanner;  

class SwedishPersonalNumber { 
    String personalNumber; 
    String personalNumberBorn = personalNumber.substring(0, 4); 
    String female = "Female"; 
    String male = "Male"; 
    // boolean isValid = true; 
    int yearBorn = Integer.parseInt(personalNumberBorn); 

    int getYearBorn() { 
     return yearBorn; 
    } 

    String getGender() { 
     if (personalNumber.charAt(10)%2 == 0) { 
      return female; 
     } 
     else 
      return male; 
    } 

    /* 
    boolean isValid() {} 
    */ 
} 

public class ScanPersonalNumber { 

    public static void main (String[] args) { 
     String scanPersonalNumber; 
     Scanner kb = new Scanner(System.in); 

     System.out.println("Enter your personalnumber likes this: 196112033581 "); 
     System.out.println("Now please enter your personalnumber"); 
     scanPersonalNumber = kb.nextLine(); 

     System.out.println("Your personalnumber is: "+ scanPersonalNumber); 
     SwedishPersonalNumber myPersonalNumber = new SwedishPersonalNumber(); 
     myPersonalNumber.personalNumber = scanPersonalNumber; 
     kb.close(); 

     System.out.println("Your birthyear is: "+ myPersonalNumber.getYearBorn()); 
     System.out.println("You are: "+ myPersonalNumber.getGender()); 
    } 
} 
+0

personalNumber n'a pas été initialisé de manière lorsque vous utilisez la méthode .Substring(), votre compilateur ne peut pas effectuer la tâche , donc il retourne null. Vous devez exécuter la fonction .subString() après que le numéro personnel a été entré. – Sterls

Répondre

0

Le problème est que vous essayez d'initialiser personalNumberBorn au début, logiquement ce que vous faites est correct, quand vous dites que personalNumberBorn devrait être une sous-chaîne de personalNumber mais si vous essayez de le voir à partir de la point de vue des compilateurs c'est ce qui va se passer:

String personalNumber; // 1) The compiler creates a empty (null) string. 
    String personalNumberBorn = personalNumber.substring(0, 4); // 2) The compiler tries to take a substring of personalNumber which we know is empty (null) 

La méthode standard de résolution de c'est écrit nos propres constructeurs, votre code ressemblerait à quelque chose comme ceci:

//...  
String personalNumber; 
String personalNumberBorn; 
String female = "Female"; 
String male = "Male"; 
// boolean isValid = true; 
int yearBorn; 

public SwedishPersonalNumber(String personalNr) { //Constructor 
    personalNumber = personalNr; 
    personalNumberBorn = personalNumber.substring(0, 4); 
    yearBorn = Integer.parseInt(personalNumberBorn); 
} 

//... 

Et au lieu d'appeler comme ceci:

SwedishPersonalNumber myPersonalNumber = new SwedishPersonalNumber(); 

vous le faites comme ceci:

SwedishPersonalNumber myPersonalNumber = new SwedishPersonalNumber(scanPersonalNumber); 
+0

Okey Je comprends ce que vous voulez dire. Mais à quoi sert personalNr? – Dolle

+0

C'est un argument pour le constructeur, de sorte que vous pouvez le faire en une ligne au lieu de deux comme vous le faites: ** SwedishPersonalNumber myPersonalNumber = new SwedishPersonalNumber(); myPersonalNumber.personalNumber = scanPersonalNumber; ** – Petter