Groups | Search | Server Info | Keyboard shortcuts | Login | Register
Groups > de.comp.lang.java > #13375
| 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 |
>>> 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 | Next — Previous in thread | Next in thread | Find similar
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