Du bist nicht angemeldet.

Werbeanzeige

Beiträge: 1 235

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

511

22.01.2015, 20:14

Zu beachten ist aber, dass das Beispiel aus Java in C++ einer Allokation auf dem Heap entspricht.
Auf dem Heap sind Arrays der Größe 0 in C++ erlaubt und es macht dort auch Sinn. Einfach um den Fall von 0 Elementen genauso behandeln zu können wie den allgemeinen Fall mit beliebig vielen Elementen. Nur auf dem Stack (bzw in Strukturen) ist es leider nicht erlaubt. Theoretisch könnte es dort aber auch Sinn machen. Zum Beispiel in generischen Code.

Toemsel

Treue Seele

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

512

22.01.2015, 20:46

Ist length vom typ double, float oder decimal macht die Exception durchaus Sinn.

birdfreeyahoo

Alter Hase

Beiträge: 766

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

513

22.01.2015, 21:02

Ne, dann wär es trotzdem im Bereich [0;Integer.MaxValue] und der Nachkommateil wäre durch den Cast verschwunden.

514

22.01.2015, 21:54

Also die >= 0 kickt mich raus, da fehlt mir irgendwie der Plan. Sonst hätte ich halt gesagt, da per Java-Standard beim casten eines long zu int dann einfach bis ntes low-order Bit "abgeschnitten" wird, dass length vom Typ long ist.

Java-Quelltext

1
2
3
long test = Integer.MAX_VALUE+1L;
if(test <= Integer.MAX_VALUE)
    System.out.println((int)test);

wird -2147483648 ausgeben, da Integer.MAX_VALUE vom Typ int ist und eben beim Vergleich test zu int gecastet wird, was nun mal kleiner als Integer.MAX_VALUE ist.
Wie man an der 0 so nun vorbeikommt wird mir nicht so ganz klar, wenn es eine primitive Datenstruktur ist.
Vielleicht ist der Code auch nur wtf wegen des unnötig großen Intervalls [0,2147483648]? :D

birdfreeyahoo

Alter Hase

Beiträge: 766

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

515

22.01.2015, 22:48

Nein, test wird nicht in int gecastet, long wird nicht in ein int implizit gecastet, da würdest du davor einen Compiler-Error bekommen.
Eher andersherum, den Integer.MAX_VALUE in long kann implizit gemacht werden.

516

22.01.2015, 23:36

Aha. Warum ist der obige Code dann äquivalent (soll heißen: die Ausgabe findet statt) mit dem folgendem?

Java-Quelltext

1
2
3
long test = Integer.MAX_VALUE+1L;
if(((int)test) <= Integer.MAX_VALUE)
    System.out.println((int)test);

Toemsel

Treue Seele

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

517

23.01.2015, 02:22

Ich vermute, dass der Fehler bei: length <= Integer.MaxValue liegt.
Versuche bereits hier zu casten. Ich tippe auf einen Rundungsfehler.

(Wie viel Sinn ein Array mit der Länge 0 hat, sei auch dahingestellt. length > 0)

Tobiking

1x Rätselkönig

  • Private Nachricht senden

518

23.01.2015, 17:49

Aha. Warum ist der obige Code dann äquivalent (soll heißen: die Ausgabe findet statt) mit dem folgendem?

Java-Quelltext

1
2
3
long test = Integer.MAX_VALUE+1L;
if(((int)test) <= Integer.MAX_VALUE)
    System.out.println((int)test);

Bei mir zeigt dein erster Code keine Ausgabe:

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Test {
     public static void main(String []args){
        System.out.println("Variante 1:");

        long test = Integer.MAX_VALUE+1L;
        if(test <= Integer.MAX_VALUE)
          System.out.println((int)test);
        else
          System.out.println("Else");


        System.out.println("Varante 2:");

        if(((int)test) <= Integer.MAX_VALUE)
          System.out.println((int)test);
        else
          System.out.println("Else");
     }
}


Ergibt:

Quellcode

1
2
3
4
Variante 1:
Else
Varante 2:
-2147483648


Ich habe es lokal und unter http://www.tutorialspoint.com/compile_java_online.php probiert.

Lokal:
Windows 8.1
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)

http://www.tutorialspoint.com/compile_java_online.php:
java version "1.7.0_71"
OpenJDK Runtime Environment (fedora-2.5.3.0.fc20-x86_64 u71-b14)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

519

23.01.2015, 18:33

Faszinierend, genau da habe ich es auch getestet. Ich bekomme jedes mal die Ausgabe. Hm. :crazy:
ideone
Also nvm.

@unter mir: HA! ICH WUSSTE ES! :D

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Checkmateing« (23.01.2015, 23:52)


BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

520

23.01.2015, 20:59

Ich "korrigiere" mal meinen Code. Aber schön zu sehen, dass er Diskussion ausgelöst hat. Blöd, dass ich schon die korrigierte Version gepostet hatte ;)

Java-Quelltext

1
2
3
        long length = response.getContentLength();
        if (length >= 0 || length <= Integer.MAX_VALUE) {
            byte[] buffer = new byte[(int) length];

--> NegativeArraySizeException
Wobei es natürlich wenig Sinn macht einen Array der Länge Integer.MAX_VALUE erzeugen zu wollen. Da steigen Java-VMs meist eh schon vorher aus. Unter Android sowieso.

(Wie viel Sinn ein Array mit der Länge 0 hat, sei auch dahingestellt. length > 0)
Ein Array der Länge 0 wird niemals eine NPE werfen, wenn man ihn verwendet. Spart Null-Checks und verhindert Exceptions, die nicht sein müssten. Zudem ist ein Array der Länge 0 ein gültiges Protobuf-Objekt ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (23.01.2015, 21:05)


Werbeanzeige