Dart 异常,泛型,声明和使用

本文介绍了Dart语言中的异常处理机制,包括自定义异常、try-catch-finally语法以及如何捕获和处理不同类型的异常。此外,还详细讲解了泛型的概念,展示了如何在List、Set和Map中使用泛型,并通过实例演示了CachePool类的泛型应用。最后,探讨了Dart中的库组织和导入方式,以及如何使用Random类生成随机数。
摘要由CSDN通过智能技术生成
/**
 * Dart 语言提供了Exception和Error类型,以及许多预定义的子类类型
 * 也可以自定义异常,Error是程序无法恢复的严重错误,表示程序出现
 * 较严重问题,而又无法通过编程处理,只能终止程序
 * 
 * 使用try语句来捕获异常,catch语句处理异常,catch语句有两个参数
 * 一个必选的异常对象,第二个是可选的堆栈对象
 * 
 */

// 自定义异常
class MyException implements Exception {
  // 接收异常信息
  final String msg;
  MyException(this.msg);
  // 覆写toString方法
  @override
  String toString() {
    // TODO: implement toString
    return msg ?? 'MyException:$msg';
  }
  
}

void main(){
  try{
    throw '这是一个异常';
  }catch(e ,s){
    print('异常详情 $e');
    print('堆栈跟踪 $s');
  }

  try{
    throw FormatException();
  }on FormatException catch(e,s){
    print('异常类型:FormatException 格式转换错误');
    print('异常详情 $e');
    print('堆栈跟踪 $s');

    // 重新抛出异常
    rethrow;

  }on IntegerDivisionByZeroException{
    print('异常类型:IntegerDivisionByZeroException');
  }finally{
    print('无论是否有异常,都会执行');
  }

  // 抛出自定义异常
  throw MyException('自定义异常');
}
/**
 * 泛型 
 * 符号<>将List标记为可泛型化的类,即类型可参数化
 * 通常使用一个字母来表示类型参数,例如E,T,S,K,V等
 * 
 * list,set 和map 字面量可以被参数化
 * 
 * class ClassName<T>{
 *  // 泛型参数定义实列变量
 * T t;
 * // 定义方法实列方法 方法返回值和参数都可以使用泛型参数T
 * 
 * T method(List<T> ts){
 *   T ts1;
 *   ts1 = ts[0]
 *   return ts1;
 * }
 * }
 * 
 */

class CachePool<T extends num>{
  final Map pool = Map();
  T getByKey(String key){
    return pool[key];
  }
  void setByKey(String key,T value){
    pool[key] = value;
  }
}

void main(){
  //创建List<String> 类型的实列
  var names = <String>['Seth','Kathy','Lars'];
  // 创建Set<String> 类型的实列
  var uniqueNames = <String>{'seth','kathy','lars'};
  // 创建Map<String,String>类型实列
  var website = <String,String>{
    'qq.com':'腾讯qq',
    'aliyun.com':'阿里云',
    'toutiao.com':'头条',
  };

  var values = List<String>();
  var setValues = Set<String>();
  var mapValues = Map<String,int>();

  // 创建泛型参数我int的实列
  var intMap = CachePool<int>();
  intMap.setByKey('frist', 2); 
  print(intMap.getByKey('frist'));  // 2
  // intMap运行时类型:CachePool<int>
  print('intMap运行时类型:${intMap.runtimeType}');

  // 创建泛型参数为String的实列
  var stringMap = CachePool<double>();
  stringMap.setByKey('hi', 1.1); 
  print(stringMap.getByKey('hi')); // 1.1
  // intMap运行时类型:CachePool<double>
  print('intMap运行时类型:${stringMap.runtimeType}');

}
/**
 * 声明和使用
 * Dart程序是由被称为库的模块化单元组成的,一个库有个多
 * 顶层声明组成,这些声明可以是函数,变量或类
 * 
 */
// 导入内置库
import 'dart:math';
// 导入第三方包
//import 'package:json_string/json_string.dart';
// 导入本地包
import 'example_01.dart';

void main(){
  // 随机数
  var random = Random();
  var randomInt = random.nextInt(100);
  print('0-100的随机数: $randomInt');
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过本课程学习您可以学习到Dart语言如下知识:第1章 Dart语言概述:Dart语言简介、Dart语言支持平台开发、Flutter为什么选择Dart语言。第2章 开发环境搭建:下载Dart SDK、Windows下安装Dart SDK、macOS下安装Dart SDK、Visual Studio Code开发工具、IntelliJ IDEA开发工具。第3章 完成个Dart程序:动动手写一个HelloWorld、Dart源代码文件组织结构、Visual Studio Code调试Dart代码、IntelliJ IDEA调试Dart代码。第4章 Dart语法基础:标识符、关键字、变量、常量、注释、库。第5章 Dart数据类型:数值类型、字符串、数据类型相互转换、布尔类型和枚举类型第6章 运算符:算术运算符、算术赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符、类型检查运算符。第7章 控制语句:分支语句、循环语句、跳转语句。第8章 函数:函数声明、可选参数、头等函数(first-class function)、匿名函数。第9章 类:类声明、getter和setter访问器、构造函数、静态变量和静态方法、级联符号。第10章 继承与多态:Dart中的继承实现、调用父类构造函数、成员变量的覆盖(Override)、方法的覆盖(Override)、多态、混入(Mixins)。第11章 抽象类与接口:抽象类、接口、Dart中隐式接口、实现接口。第12章 数据容器:List容器、Set容器、Map容器、泛型。第13章 异常处理:捕获异常、try-on捕获异常、try-catch捕获异常、try-on-catch捕获异常使用finally代码块、手动抛出异常自定义异常类。第14章 异步编程:Dart异步处理机制、案例:同步函数实现读取文件、案例:异步函数实现读取文件、Future对象。  
Dart 是一种支持泛型的面向对象语言,它允许我们在定义类、函数或方法时使用参数化类型。泛型允许我们在不指定具体类型的情况下编写通用的代码,提高代码的重用性和安全性。 在 Dart 中,泛型的类型变化可分为两种:类型的协变(Covariance)和类型的逆变(Contravariance)。 类型的协变指的是可以将泛型类型的子类型赋值给父类型,这样就可以确保在使用泛型类型时不会发生类型不匹配的错误。例如,如果有一个泛型类 Animal<T>,其中 T 是一个类型参数,那么 Animal<Dog> 就是 Animal<Animal> 的子类型。这样我们可以使用 Animal<Animal> 类型的变量来持有 Animal<Dog> 的实例,而不会出现类型错误。 类型的逆变与协变相反,指的是可以将泛型类型的父类型赋值给子类型。这样可以更灵活地使用泛型类型,更好地符合实际的业务需求。例如,如果有一个泛型类 Comparator<T>,其中 T 是一个类型参数,那么 Comparator<Animal> 就是 Comparator<Dog> 的父类型。这样我们可以使用 Comparator<Dog> 类型的变量来持有 Comparator<Animal> 的实例,而不会出现类型错误。 泛型的型变在 Dart使用通配符来表示,泛型类型的协变使用 extends 关键字,逆变使用 super 关键字。例如,在声明一个泛型类型时,我们可以使用 Animal<? extends Animal> 表示协变,使用 Comparator<? super Dog> 表示逆变。这样的声明帮助我们在使用泛型类型时确保类型的正确性。 总结来说,Dart 中的泛型支持类型的协变和逆变,这样可以更灵活、更安全地使用泛型类型。泛型的型变通过使用通配符、extends 和 super 关键字来表示,使得泛型类型的赋值更加灵活,能够满足不同的业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值