Me aparecen los siguientes errores en este programa y no se donde está el fallo.
Exception in thread "main" java.lang.NullPointerException
at examen2.Ciudadano.toString(Ciudadano.java:20)
at examen2.Principal.main(Principal.java:8)
Este es mi código:
public class Persona {
String nombre;
char sexo;
public Persona() {
sexo='F';
}
public void setPersona(String nombre,char sexo){
this.nombre=nombre;
this.sexo=sexo;
}
public String toString(){
return " Nombre:" + nombre + " Sexo:" + sexo ;
}
}
import java.util.Scanner;
public class Ciudadano {
Persona per1;
int dni;
public Ciudadano() {
dni=0;
}
public void setCiudadano(int dni){
per1 =new Persona();
Scanner sc=new Scanner (System.in);
System.out.println("Escribir nombre y sexo de persona(M,F)");
per1.setPersona(sc.nextLine(),sc.next().charAt(0));
this.dni=dni;
}
public String toString(){
return per1.toString() + " DNI " + dni;
}
}
public class Principal {
public static void main(String[] args) {
Ciudadano p1=new Ciudadano();
Ciudadano p2=new Ciudadano();
System.out.println(p1.toString() + p2.toString());
}
}
я изменил твой код setCiudadano(int dni)
в это:
public void setCiudadano(int dni){
per1 =new Persona();
Scanner sc=new Scanner (System.in);
System.out.println("Escribir nombre y sexo de persona(M,F)");
//esto puede quedar igual a como lo tenías e igual funciona, pero para mejor entendimiento te lo dejo así.
String nombre = sc.nextLine();
char sexo = sc.nextLine().charAt(0);
per1.setPersona(nombre, sexo);
this.dni=dni;
}
в тебе main
я это изменил в это:
public class Principal {
public static void main(String[] args) {
Ciudadano p1=new Ciudadano();
Ciudadano p2=new Ciudadano();
p1.setCiudadano(1);
p2.setCiudadano(2);
System.out.println(p1.toString());
System.out.println(p2.toString());
}
}
и это прокрутив изображение в окне, оно функционировало так:
Проблема коренится, в котором в SetCiudadano
он имеет объявленный int dni и это захотев прокрутить изображение в окне, ты ничего не объявил. В тебе system.out.printl(p1.toString()+p2.toString())
будь должен показывать данные или, что уже он ввел в компьютер, и ты нарушаешь это, перед тем, как это помещать в один system.out.println();
, ты должен делать операции или инструкции, которые ты хочешь сделать. И потом показывать уже результат.
Когда ты делаешь инстанцию Cuidadano
, член per1 (класс Persona
) это Null. Только ему распределяется ссылка в момент призывания в метод setCiudadano
. Самое рекомендуемое в моей концепции состояло бы в том, чтобы реализовывать инстанцию per1 в строителе Ciudadano
вместо того, чтобы делать ее в методе setCiudadano
.
public Ciudadano() {
per1 = new Persona();
dni=0;
}
Ты, должно быть, это делаешь:
p1.setCiudadano(20);
Так как класс у Гражданина есть переменная per1 типа, Является лично, которая инициализируется в методе setCiudadano. Когда ты делаешь следующее: p1=new Ciudadano()
переменная per1 null
поэтому тебя помечает эта ошибка в System.
Я рекомендовал бы тебе использовать Наследство, так как внутри POO он не остается совсем правильным, что один Ciudadano
имейте одну Persona
.
Ошибка:
Exception in thread "main" java.lang. NullPointerException at examen2. Ciudadano.toString (Гражданский java:20) at examen2. Principal.main (Главный java:8)
получается, так как у переменной per1
есть стоимость null, чтобы это предотвращать, перед тем, как звонить mГ©todo:
public String toString(){
return per1.toString() + " DNI " + dni;
}
ты, должно быть, называешь mГ©todo setCiudadano()
, чтобы инициализировать per1
:
public void setCiudadano(int dni){
per1 =new Persona();
Scanner sc=new Scanner (System.in);
System.out.println("Escribir nombre y sexo de persona(M,F)");
per1.setPersona(sc.nextLine(),sc.next().charAt(0));
this.dni=dni;
}
Persona per1
недействительный, поэтому выполнивCiudadano#toString
и выполнятьper1.toString()
, брось NPE, потому чтоper1
недействительный. solució n он состоит в том, чтобы называть mé совсемsetCiudadano(<algún valor>)
, поскольку ты предлагаешь, но это не evitará , который, если не был призванCiudadano#setCiudadano
, продолжал бы бросать в себя NPE. solució n правильная он состоит в том, чтобы исправлять mé совсемtoString
для того, чтобы он вынес случай, в которомper1
недействительный. – 21.12.2016, 22:51