2013-10-14 5 views
1

J'ai trois classes, Main:Exception essayant de traiter les entrées utilisateur

public class Main { 
public static void main(String []args){ 
    UserData myData = new UserData(); 
    SolveMath myMath = new SolveMath(); 
    myMath.findLength(); 
    } 
} 

UserData (gets l'entrée utilisateur):

import java.util.Scanner; 
public class UserData { 
private double side1; 
private double side2; 
private double side3; 
private double weight; 
public UserData(){ 
    Scanner scan = new Scanner(System.in); 

    System.out.println("Enter side one:"); 
    side1 = scan.nextDouble(); 
    System.out.println("Enter side two:"); 
    side2 = scan.nextDouble(); 
    System.out.println("Enter side three:"); 
    side3 = scan.nextDouble(); 
    System.out.println("Enter weight:"); 
    weight = scan.nextDouble(); 
} 

public double getSide1(){ 
    return side1; 
} 
public double getSide2(){ 
    return side2; 
} 
public double getSide3(){ 
    return side3; 
} 
public double getWeight(){ 
    return weight; 
    } 
} 

Et SolveMath (qui tente jusqu'à présent seulement pour trouver le plus grand côté):

public class SolveMath { 
private double length; 
UserData userData; 

public void findLength(){ 
    if(userData.getSide1() > userData.getSide2() && userData.getSide1() > userData.getSide3()){ 
     length = userData.getSide1(); 
    }else if(userData.getSide2() > userData.getSide1() && userData.getSide2() > userData.getSide3()){ 
     length = userData.getSide2(); 
    }else if(userData.getSide3() > userData.getSide1() && userData.getSide3() > userData.getSide2()){ 
     length = userData.getSide3(); 
    } 
    System.out.println(length); 
} 

}

Quand je compile je reçois cette erreur (erreur de note se produit après que toutes les entrées ont été données):

Exception in thread "main" java.lang.NullPointerException 
at eval.user.data.SolveMath.findLength(SolveMath.java:17) 
at drivers.Main.main(Main.java:17) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 

Process finished with exit code 1 

Suis-je manque quelque chose quand j'essaie de trouver le plus grand côté?

+1

Quelle ligne est 'SolveMath.java: 17'? – ssantos

+2

Parce que vous n'avez pas initialisé 'UserData' dans la classe' solveMath' – SRy

+1

Vous devez injecter 'UserData' dans' SolveMath' – nachokk

Répondre

2

Vous n'êtes pas initialiser la variable userData dans SolveMath classe, donc ce line.-

if(userData.getSide1() > userData.getSide2() && userData.getSide1() > userData.getSide3()) 

lance le NullPointerException dans le premier accès à userData.

Vous pouvez ajouter un constructeur par défaut pour SolveMath class.-

public SolveMath() { 
    userData = UserData(); 
} 
2

Le membre userData dans votre SolveMath exemple est null, de sorte que vous obtenez le NullPointerException. main() doit indiquer à l'instance SolveMath, "Voici une instance UserData à utiliser", puis l'instance SolveMath doit l'utiliser.

Vous pouvez le faire en ajoutant un argument constructeur au constructeur de SolveMath et en passant l'instance de main() en tant que paramètre à l'appel du constructeur. Ensuite, le constructeur doit stocker l'instance dans la variable membre que vous avez déjà.

1

La variable userData dans la classe SolveMath est toujours null, ce qui signifie que vous essayez d'appeler des méthodes sur null, ce qui est illégal (d'où le NullPointerException).

Vous devez vous assurer que le champ userData dans votre classe SolveMath obtient une référence à l'instance userData de Main. Un moyen serait de passer simplement via le constructeur, comme suit:

UserData userData = new UserData(); 
SolveMath myMath = new SolveMath(userData); // <-- add as parameter here 

Pour faire ce travail, vous aurez également besoin d'ajouter un constructeur à SolveMath qui prend un paramètre UserData:

public class SolveMath { 

    private UserData userData; 

    public SolveMath(UserData userData) { 
     // Set the private field to the instance passed in 
     this.userData = userData; 
    } 

    ... 
} 

Je voudrais également penser à changer votre findLength() fonction pour vérifier si userData est null (et éventuellement jeter sa propre exception) avant de tenter de l'utiliser.

-1

UserData est null. Vous devez passer userData comme paramètre à solvemath et bien sûr solvemath doit avoir une fonction set ou un constructeur pour passer des données utilisateur.Vous pouvez donner des valeurs par défaut à l'intérieur du constructeur. Donc, solvemath doit avoir un constructeur supplémentaire ou une méthode set. Vous choisissez

+0

mais alors l'utilisateur est invité à donner des longueurs de côté comment puis-je éviter cela? –

+0

Cette réponse est fausse - regardez les autres. –

+0

Tous les autres disent que userdata n'est pas initialisé. Pourquoi ai-je tort? –

0

Vous n'initialisez pas l'instance UserData dans SolveMath.

Une façon serait de passer par un constructeur comme ci-dessous

public class SolveMath { 
    private double length; 
    UserData userData; 

    public SolveMath(final UserData userData) { 
     this.userData = userData; 
    } 

    public void findLength(){ 
     if(userData.getSide1() > userData.getSide2() && userData.getSide1() >    userData.getSide3()){ 
     length = userData.getSide1(); 
     }else if(userData.getSide2() > userData.getSide1() && userData.getSide2() > userData.getSide3()){ 
     length = userData.getSide2(); 
     }else if(userData.getSide3() > userData.getSide1() && userData.getSide3() > userData.getSide2()){ 
     length = userData.getSide3(); 
    } 
    System.out.println(length); 
    } 
} 

public class Main { 
    public static void main(String []args){ 
     UserData myData = new UserData(); 
     SolveMath myMath = new SolveMath(myData); 
     myMath.findLength(); 
    } 
} 
Questions connexes