Math.toIntExact în Java

Transformă un long în int și aruncă ArithmeticException dacă valoarea nu încape, în loc să o taie în tăcere.

Sintaxă
static int toIntExact(long valoare)

Ce face Math.toIntExact

Conversia (int) x dintr-un long păstrează doar ultimii 32 de biți: dacă numărul este prea mare, rezultatul este o valoare fără legătură cu originalul, poate chiar negativă. Math.toIntExact(x) returnează același număr ca int dacă încape și aruncă ArithmeticException dacă nu.

Este util când o metodă îți dă un long (de exemplu stream.count() sau dimensiunea unui fișier) și ai nevoie de un int pentru un array sau un index.

Parametri

Parametru Descriere
valoare Numărul long de convertit.

Ce returnează

Valoarea ca int.

Exemple

Exemplul 1: Conversie sigură față de cast

public class Main {
    public static void main(String[] args) {
        long mic = 2026L;
        long mare = 5_000_000_000L;
        System.out.println(Math.toIntExact(mic));
        System.out.println((int) mare);
        try {
            System.out.println(Math.toIntExact(mare));
        } catch (ArithmeticException e) {
            System.out.println("Eroare: " + e.getMessage());
        }
    }
}

Rezultat

2026
705032704
Eroare: integer overflow

Exemplul 2: Numărul de elemente dintr-un stream

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> orase = List.of("Iași", "Cluj", "Arad", "Bacău", "Alba Iulia");
        long cuA = orase.stream().filter(o -> o.startsWith("A")).count();
        String[] rezultat = new String[Math.toIntExact(cuA)];
        System.out.println("Spațiu pentru " + rezultat.length + " orașe");
    }
}

Rezultat

Spațiu pentru 2 orașe

Greșeli frecvente

  • Folosești (int) pe un long care vine din exterior (fișier, bază de date). O valoare mare devine în tăcere un număr greșit.

Comenzi înrudite

  • Math.addExact: Adunare, scădere, înmulțire, incrementare și negare care aruncă ArithmeticException la overflow în loc să dea rezultat greșit.
  • Math.max: max() și min() aleg cel mai mare sau cel mai mic dintre două numere; clamp() încadrează o valoare între două limite.
  • Long.parseLong: Long este wrapperul pentru long (întregi pe 64 de biți); parseLong și valueOf transformă textul în număr.
  • Integer: Clasa wrapper pentru int: obiectul care învelește un număr întreg, plus constante și metode de conversie.