Ist das ein korrekter Regex-Ausdruck?

funktionierdoch

Cadet 2nd Year
Registriert
Dez. 2018
Beiträge
19
Nabend, Ich habe hier (https://www.regextester.com/96875) nach einer Grammatik für gültige Kennzeichen gegooglet, es versucht in meine Methode zu implementieren. Die Konsole gibt eine Nullpointerexception bei der Methode aus. Ist die if Bedingung mit .matches korrekt`?

Java:
 public [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] getKennzeichen() {
            if (this.kennzeichen.matches("[A-ZÖÜÄ]{1,3} [A-ZÖÜÄ]{1,2} "
                    + "[1-9]{1}[0-9]{1,3}")) {
               
                return this.kennzeichen;
               
            } else {
               
                return "Kennzeichen ungueltig.";
            }
    }

Die Konsole gibt eine Nullpointerexception bezüglich this.kennzeichen aus... Warum?
 
Bist Du sicher dass in this.kennzeichen auch ein Wert drin steht?
Ich würde auf jedenfall noch
if (this.kennzeichen == null) return "Kennzeichen nicht gesetzt";
in die erste Zeile von der Methode machen.
 
Java:
if (auswahl.equals("N")) {
                
                boolean korrekt = true;
                
                System.out.println("Welche Art von Vehikel moechten Sie " 
                    + "erstellen?");
                
                String vehArt = scan.nextLine();
                
                if (vehArt.equals("Auto")) {
                    do {
                        try {
                            System.out.println("Geben sie Kennzeichen und" 
                                + " PS ein: ");
                            String kennzeichen = scan.nextLine();
                            int ps = scan.nextInt();
                            Auto auto = new Auto(kennzeichen, ps);
                            System.out.println(auto);
                        } catch (InputMismatchException e) {
                            System.out.println("Eingaben ungueltig.");
                            korrekt = false;
                            scan.nextLine();
                        }
                    } while(!korrekt);
                }
I
In dieser Main Methode gebe ich zumindest in den Konstruktor das Kennzeichen ein...
 
Es waere wohl effizienter wenn du mal den ganzen Code zeigst...den Konstructor u.a.

MCVE ist das Stichwort wenn man Hilfe beim Debugging von Code haben will. Obwohl, wenn wir mal ehrlich sind, der richtige Weg ist einen Debugger zu nutzen
 
Java:
package mobil;
import java.util.Scanner;

public abstract class Vehikel {
    
    private String kennzeichen;
    private int ps;
    
    public Vehikel (String kennzeichen, int ps) {

    }


    Scanner scan = new Scanner (System.in);

    public static final double kw = 0.735;



    public String getKennzeichen() {
         if (this.kennzeichen == null)
             return "Kennzeichen nicht gesetzt";
         
            if (kennzeichen.matches("[A-ZÖÜÄ]{1,3} [A-ZÖÜÄ]{1,2} "
                    + "[1-9]{1}[0-9]{1,3}")) {
                
                return kennzeichen;
                
            } else {
                
                return "Kennzeichen ungueltig.";
            }
    }
    
    public int getPS() {
        boolean weiter = true;
        do {
            
            if (this.ps <= 0) {
                System.out.println("PS muss positiv sein.");
                ps = scan.nextInt();
                weiter = false;
            }
            
        } while (!weiter);
        
        return ps;
    }
    
    public double getKW() {
         double kiloWattStunden = this.ps * kw;
    
         return kiloWattStunden;
    }
    
    public abstract double getSteuer();
        
    public abstract boolean mayDriveOnHighway();
    
    public String toString() {
        return "Kennzeichen: " + getKennzeichen() + ", Leistung in PS und kW: "
                + getPS() + getKW() + ", Steuer: " + getSteuer() + "Darf das "
                + "Auto auf der Autobahn fahren: " + mayDriveOnHighway();
    }
Java:
package mobil;

public class Traktor extends Vehikel {



    
    public Traktor(String kennzeichen, int ps) {
        super(kennzeichen, ps);

    }

    @Override
    public double getSteuer() {
        double steuern = getKW() * 0.70;
        return steuern;
    }

    @Override
    public boolean mayDriveOnHighway() {
        return false;
    }

    
    
    
    
    public static void main(String[] args) {

    }
}
Java:
package mobil;


public class Auto extends Vehikel {



    public Auto(String kennzeichen, int ps) {
        super(kennzeichen, ps);

    }

    @Override
    public double getSteuer() {
        double steuern = 0;
        
        if (getKW() <= 40) {
            steuern = getKW() * 2;
            
        } else if (getKW() <= 120) {
            steuern = getKW() * 3.11;
            
            
        } else {
            steuern = 130 + (getKW() * 4);
        }
        
        return steuern;
    }

    @Override
    public boolean mayDriveOnHighway() {
        return getPS() >= 40;
    }
    
    
    
    
    
    
    
    
    
    
    
    public static void main(String[] args) {
        

    }
}

Java:
import mobil.*;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        
        Scanner scan = new Scanner(System.in);
        
        boolean weiter = true;
      
        do {
            
            System.out.println("N: Neues Vehikel anlegen");
            System.out.println("L: Ein Vehikel löschen");
            System.out.println("Z: Alle Vehikel anzeigen");
            System.out.println("E: Programm beenden");
            
            String auswahl = scan.nextLine();
            
            if (auswahl.equals("N")) {
                
                boolean korrekt = true;
                
                System.out.println("Welche Art von Vehikel moechten Sie " 
                    + "erstellen?");
                
                String vehArt = scan.nextLine();
                
                if (vehArt.equals("Auto")) {
                    do {
                        try {
                            System.out.println("Geben sie Kennzeichen und" 
                                + " PS ein: ");
                            String kennzeichen = scan.nextLine();
                            int ps = scan.nextInt();
                            Auto auto = new Auto(kennzeichen, ps);
                            System.out.println(auto);
                        } catch (InputMismatchException e) {
                            System.out.println("Eingaben ungueltig.");
                            korrekt = false;
                            scan.nextLine();
                        }
                    } while(!korrekt);
                }
                    
            } else if (auswahl.equals("L")) {
               
            } else if (auswahl.equals("Z")) {
                  

            } else if (auswahl.equals("E")) {
                weiter = false;
                } 
            
            
            
            
            
            
            
            
            
        } while (weiter);

        scan.close();
    }

}
Ergänzung ()

Ich lese mich mal ins debuggen rein... habe ich noch nie probiert.
 
Da haben wir den Fehler:
Code:
   private String kennzeichen;
   private int ps;

    public Vehikel (String kennzeichen, int ps) {

    }

Das "kennzeichen" welches im Konstruktor als Parameter steht ist eine völlig andere Variable als das "kennzeichen" in Deiner Klasse (dass die gleich heißen ist egal). Du musst das explizit zuweisen. In kennzeichen von der Klasse steht sonst nichts drin.

Wenn wir schon dabei sind, noch eine kurze Info:
Code:
String kennzeichen = scan.nextLine();
int ps = scan.nextInt();
Auto auto = new Auto(kennzeichen, ps);
Die Variable "kennzeichen" in diesem Code Teil ist ebenfalls eine andere Variable als die beiden im Code von der Klasse. Wenn Du den Wert von einer der 3 "kennzeichen" Variablen änderst, ändert sich der Wert von den anderen beiden nicht. Den Irrtum machen Programmieranfänger häufig.

Probier mal das:
Code:
   private String kennzeichen;
   private int ps;

    public Vehikel (String kennzeichen, int ps) {
         this.kennzeichen = kennzeichen;
         this.ps = ps;
    }
Das "this" kann man eventuell weglassen. Weiß nicht wie Java das macht. Ich Programmiere mehr C#.

Um diesen Irrtum zu vermeiden, solltest Du eventuell ein anderes Schema für die Namen benutzen. Bei uns C# Programmierern ist es üblich Parameter und lokale Variablen klein zu schreiben, private Felder klein mit Unterstrich davor und öffentliche Felder groß. Also so:

C#:
class Beispiel
{
  private int _a;
  public int B;
  public Beispiel(int a, int b)
  {
      _a = a;
      B = b;
  }
}
 
Zuletzt bearbeitet:
Oh mann, dass man ich sie noch zuweisen muss habe ich verpeilt .Vielen dank für deine ausführliche Antwort!
 
Zurück
Oben