2017-12-03 154 views
6
int[][] a = new int[0][5]; 

Dlaczego powyższy kod jest poprawny w java?Dlaczego można utworzyć dwuwymiarową tablicę z 0 wierszy, ale 5 kolumn w java?

Ta tablica 2d jest praktycznie bezużyteczna, ponieważ pierwszym wymiarem jest ZERO. Logicznie, jeśli pierwszy wymiar to 0, drugi wymiar nie powinien być większy niż 0.

Rozumiem, że możemy zainicjować pustą tablicę 1d.

+2

Ponieważ pusta tablica jest vallid? – NickL

+1

Jeszcze prostsze: 'int [] a = new int [0];' –

Odpowiedz

6

By the JLS wyrazem tablicą wskazującą rozmiar zero jest ważna - to jest po prostu wyrazem - tak można prawnie zadeklarować tablicę n-wymiarowej, która ma zerowy liczność.

Jedyną rzeczą, która sprawdza JLS Lexer (jak Java 8) jest whether or not the expression evaluates to zero:

Następnie wartości wyrażeń wymiarowych są sprawdzane. Jeśli wartość dowolnego wyrażenia DimExpr jest mniejsza niż zero, generowany jest wyjątek NegativeArraySizeException.

To nic nie mówi o jego przydatności, a jestem pewien, że jesteś świadomy, każda próba indeks do tej tablicy będzie produkować ArrayIndexOutOfBoundsException od lokalizacji Indeks zaczyna się od zera.

+0

Zrozumiałeś moje pytanie. Dziękuję za odpowiedź. Zasadniczo pozwala na to gramatyka, ale ta tablica 2d jest praktycznie bezużyteczna. –

-2

Jest to całkowicie legalne, ponieważ tworzysz tylko pięć pustych tablic.

int[][] arr_ = {{}, {}, {}, {}, {}};

+2

Nie, zadeklarowałeś tablicę int [5] [0]. Najżejszy parametr odpowiada najbardziej wewnętrznemu układowi w dosłownym wyrażeniu. –

2

To nie powinno być dziwne myśleć jako pustą tablicę jako coś normalnego. Istnieje bardzo podobny przypadek, w którym cały czas mamy do czynienia z pustymi tablicami.

List<String> names = new ArrayList<String>(); 

names jest obecnie pustą tablicą. Czy nie byłoby dziwnie zawsze deklarować tablice z co najmniej pierwszym elementem?

List<String> names = new ArrayList<String>(Arrays.asList("John")); 

Alternatywą new int[0] jest ważne składni będzie ustawić tablicę null gdy pierwszy element nie jest dostępny. W tym świecie oczekiwano by, że przed sprawdzeniem tablicy będziemy regularnie sprawdzać, czy nie ma ona wartości null.

int[] nums = null; // Because empty primitive arrays are "weird" 

//typical for-each loop 
if(nums != null){ 
    for(int x: nums){ 
     // do something 
    } 
} 
//typical for loop 
if(nums != null){ 
    for(int c = 0; c < nums.length; c++){ 
     // do something 
    } 
} 

Bez pustych tablic, regularne pętli rzucał NullPointerException wszystko czas. Wszystko to powiedziawszy, dziwne jest używanie new int[0][5] zamiast new int[0][]. Nie sądzę, że to godne błąd składni, ale myślę, że zasługuje jeden z nich z IDE:

warning light