¿Cómo puedo solucionar los siguientes errores en este programa?

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());
    }
}
1
задан 21.12.2016, 22:07
5 ответов

я изменил твой код 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());

            }
}

и это прокрутив изображение в окне, оно функционировало так:

introducir la descripción de la imagen aquí

Проблема коренится, в котором в SetCiudadano он имеет объявленный int dni и это захотев прокрутить изображение в окне, ты ничего не объявил. В тебе system.out.printl(p1.toString()+p2.toString()) будь должен показывать данные или, что уже он ввел в компьютер, и ты нарушаешь это, перед тем, как это помещать в один system.out.println();, ты должен делать операции или инструкции, которые ты хочешь сделать. И потом показывать уже результат.

-2
ответ дан 24.11.2019, 11:55
  • 1
    Это не raí z проблемы. raí z дело в том, что признак 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

Обрати внимание, что до тех пор, пока ты не сделаешь например

p1.setCiudadano(2000000)

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

1
ответ дан 24.11.2019, 11:55

Когда ты делаешь инстанцию Cuidadano, член per1 (класс Persona) это Null. Только ему распределяется ссылка в момент призывания в метод setCiudadano. Самое рекомендуемое в моей концепции состояло бы в том, чтобы реализовывать инстанцию per1 в строителе Ciudadano вместо того, чтобы делать ее в методе setCiudadano.

public Ciudadano() {
  per1 = new Persona();
  dni=0;
}
0
ответ дан 24.11.2019, 11:55

Ты, должно быть, это делаешь:

p1.setCiudadano(20);

Так как класс у Гражданина есть переменная per1 типа, Является лично, которая инициализируется в методе setCiudadano. Когда ты делаешь следующее: p1=new Ciudadano() переменная per1 null поэтому тебя помечает эта ошибка в System.

Я рекомендовал бы тебе использовать Наследство, так как внутри POO он не остается совсем правильным, что один Ciudadano имейте одну Persona.

0
ответ дан 24.11.2019, 11:55

Ошибка:

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;
    }
0
ответ дан 24.11.2019, 11:55