TypeError în Dart

Eroarea aruncată la rulare când o valoare nu are tipul cerut, de exemplu la o conversie cu as sau la ! pe null.

Sintaxă
class TypeError extends Error

Ce face TypeError

Compilatorul prinde majoritatea problemelor de tip. Unele apar însă abia la rulare, când valoarea reală nu are tipul așteptat: o conversie as greșită (valoare as int când valoarea este text), operatorul ! aplicat pe null, sau date dynamic din JSON folosite ca alt tip. În aceste cazuri se aruncă TypeError.

Mesajul spune ce tip s-a găsit și ce tip se aștepta, de exemplu type 'String' is not a subtype of type 'int' in type cast. Ca și celelalte Error-uri, semnalează o greșeală în cod: soluția este să verifici tipul înainte, cu is sau cu un pattern, nu să prinzi eroarea.

Exemple

Exemplul 1: Conversii greșite

void main() {
  Object varsta = '21';
  try {
    var n = varsta as int;
    print(n);
  } on TypeError catch (e) {
    print(e);
  }
  String? oras;
  try {
    print(oras!.length);
  } on TypeError catch (e) {
    print(e.runtimeType);
  }
}

Rezultat

type 'String' is not a subtype of type 'int' in type cast
_TypeError

Exemplul 2: Date JSON citite în siguranță

În loc să convertim orbește cu as, verificăm tipul cu un pattern case.

import 'dart:convert';

void main() {
  var date = jsonDecode('{"nume": "Ana", "varsta": "21"}') as Map<String, dynamic>;
  try {
    var varsta = date['varsta'] as int;
    print(varsta);
  } on TypeError {
    print('varsta nu este număr în JSON');
  }
  var varsta = switch (date['varsta']) {
    int v => v,
    String s => int.tryParse(s) ?? 0,
    _ => 0,
  };
  print('Vârsta: $varsta');
}

Rezultat

varsta nu este număr în JSON
Vârsta: 21

Greșeli frecvente

  • Scrii json['pret'] as double, iar JSON-ul conține 10 (un int). Conversia aruncă TypeError; folosește (json['pret'] as num).toDouble().

Comenzi înrudite

  • as: Spune că o valoare are un anumit tip (cast); dacă nu are, aruncă TypeError. Tot as dă un prefix unui import.
  • is și is!: Verifică la rulare dacă o valoare are un anumit tip; după verificare, variabila poate fi folosită ca acel tip.
  • Error: Clasa de bază pentru greșelile de programare (index greșit, argument invalid); stackTrace arată unde a fost aruncată.
  • null safety (? ! ?? ??=): Tipurile nu pot fi null decât dacă au ?; operatorii !, ?? și ??= lucrează cu valorile care pot lipsi.