Groups | Search | Server Info | Keyboard shortcuts | Login | Register


Groups > de.comp.lang.java > #13375

Re: Was ist an dieser Klasse falsch?

From Johannes Freiberger <nomail@space.invalid>
Newsgroups de.comp.lang.java
Subject Re: Was ist an dieser Klasse falsch?
Message-ID <h85v6gtsaasp53fth710kht3lgi46m4vsb@4ax.com> (permalink)
References <hofcgiFjp5jU1@mid.individual.net> <hofcsgFk3c6U2@mid.individual.net> <rfu129$1lif$1@news-cypress.fernuni-hagen.de> <hofh3rFkljtU2@mid.individual.net>
Organization Forte - www.forteinc.com
Date 2021-04-09 01:53 +0200

Show all headers | View raw


>>> Peter Heitzer <peter.heitzer@rz.uni-regensburg.de> wrote:
>>>> Ich habe ein Verständnisproblem mit folgendem kleinen Stück Javacode:
>>> 
>>>> import java.util.*;
>>> 
>>>> public class P extends Properties {
>>>>        public String getProperty(String p) {
>>>>                return super.getProperty(p,"de");
>>>>        }
>>>>        
>>>>        public static void main(String[] args) {
>>>>                P x=new P();
>>>>                x.setProperty("a","b");
>>>>                System.out.println(x.getProperty(args[0]));
>>>>        }
>>>> }
>>> 
>>>> Es wird ohne Fehler übersetzt. Wenn man es aber startet bricht es mit
>>>> Stackoverflow ab. Ich kann mir nicht erklären, was hier passiert.
>>>> Die abgeleitete Klasse P überschreibt die Methode getProperty(String) und
>>>> ruft darin die Originalmethode getProperty(String,String) auf.
>>>> Das Laufzeitverhalten mit Stackoverflow schaut aber für mich so aus, als
>>>> ob die überschriebene Methode sich selbst aufruft.
>>>> Wer kann mir das Verhalten erklären?

Der Stacktrace sagt folgendes:
---------------------------
Exception in thread "main" java.lang.StackOverflowError
	at java.base/java.util.Properties.getProperty(Properties.java:1142)
	at MyClass.getProperty(MyClass.java:5)
	at java.base/java.util.Properties.getProperty(Properties.java:1142)
	at MyClass.getProperty(MyClass.java:5)
	[...]
---------------------------

Die Codestelle 'java.util.Properties:1142' sieht so aus:
---------------------------
    public String getProperty(String key, String defaultValue) {
!-->    String val = getProperty(key);
        return (val == null) ? defaultValue : val;
    }
---------------------------

In der markierten Zeile wird die Methode 'getProperty' des Objektvariablentyps
aufgerufen. Und das ist deine Klasse P. Der Code springt also endlos zwischen
deiner Klasse und Properties hin und her, bis der Stack voll ist.

Wollte man dieses Verhalten beheben, so sähe der Fix wie folgt aus:

---------------------------
    public String getProperty(String key, String defaultValue) {
!-->    String val = this.getProperty(key);
        return (val == null) ? defaultValue : val;
    }
---------------------------

Mit 'this.getProperty(String)' würde die Methode derselben Klasse aufgerufen
und gäbe keine endlose Rekursion.

Ciao.

Back to de.comp.lang.java | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Re: Was ist an dieser Klasse falsch? "Peter Heitzer" <peter.heitzer@rz.uni-regensburg.de> - 2020-07-30 07:58 +0000
  Re: Was ist an dieser Klasse falsch? Michael Paap <feunews@mpaap.de> - 2020-07-30 10:40 +0200
    Re: Was ist an dieser Klasse falsch? "Peter Heitzer" <peter.heitzer@rz.uni-regensburg.de> - 2020-07-30 09:10 +0000
      Re: Was ist an dieser Klasse falsch? Michael Paap <feunews@mpaap.de> - 2020-07-30 13:05 +0200
      Re: Was ist an dieser Klasse falsch? Patrick Roemer <sangamon@netcologne.de> - 2020-07-30 14:22 +0200
        Re: Was ist an dieser Klasse falsch? "Peter Heitzer" <peter.heitzer@rz.uni-regensburg.de> - 2020-07-30 13:24 +0000
      Re: Was ist an dieser Klasse falsch? Johannes Freiberger <nomail@space.invalid> - 2021-04-09 01:53 +0200
        Re: Was ist an dieser Klasse falsch? Johannes Freiberger <nomail@space.invalid> - 2021-04-09 03:04 +0200
          Re: Was ist an dieser Klasse falsch? Johannes Freiberger <nomail@space.invalid> - 2021-04-09 03:12 +0200

csiph-web