Flutter Dart函数(方法)异常

目录

函数(方法)

可选命名参数

「required」

可选位置参数

默认参数值

匿名方法

函数是一等对象

异常


函数(方法)

        Dart 是一个真正的面向对象语言,方法也是对象并且具有一种 类型 Function。 这意味着,方法可以赋值给变量,也可以当做其他方法的参数。

        「格式」:这个跟Java类似,比Java更方便一些,但是不支持方法重载,也就是说方法名不能一致

Type(返回类型) funcName(方法名) (parameter{参数})
{
   return value;
}

//例如main函数
void main(){
  
}
int add(int i,int j) {
  return i + j;
}
//也可以选择忽略类型(不推荐)
add( i, j) {
  return i + j;
}
//对于只有一个表达式的方法,可以选择使用缩写语法来定义:
add(i, j) => i + j;
//在箭头 (=>) 和分号 (;) 之间只能使用一个 表达式 ,不能是 语句 。 
//例如:不能使用 if 语句 ,但是可以是用 条件表达式.

        「不支持方法重载」

函数可以有「两种类型」的参数:

  • 必需的

  • 可选的。

        必需的参数需要在参数列表前面, 后面再定义可选参数。

可选命名参数

        把方法的参数放到 {} 中就变成可选 命名参数。这个在后续的页面绘制中非常常见。

String add({String? a,String? b,String? c}){
  return "a=$a,b=$b,c=$c";
}

调用方法的时候,可以使用这种形式 paramName: value 来指定命名参数。例如:

void main(){
  //无必须参数
  print(add());//a=null,b=null,c=null
  //选择传递参数
  print(add(a: "1"));//a=1,b=null,c=null
  //选择传递参数,位置随意
  print(add(b:"22",a:"11"));//a=11,b=22,c=null
  //位置随意
  print(add(a:"11",c:"33",b: "25"));//a=11,b=25,c=33
}

「required」

        主要用于允许根据需要标记任何命名参数(函数或类),使得它们不为空。因为可选参数中必须有个 required 参数或者该参数有个默认值。

String addRequired({String? a, required String b,String? c}){
  return "a=$a,b=$b,c=$c";
}

        参数 b 被required修饰,也就说 b 是必传的,否则编译不通过。

        前两个调用addRequired函数因未传入b直接报错。

  print(addRequired());
  print(addRequired(a: "1"));
  print(addRequired(b: "66"));//a=null,b=66,c=null
  print(addRequired(b:"99",a:"55"));//a=55,b=99,c=null
  print(addRequired(a:"88",c:"66",b: "77"));//a=88,b=77,c=66

可选位置参数

        把方法的参数放到 [] 中就变成可选 位置参数。

String joint([String? a,String? b,String? c]){
  return "a=$a,b=$b,c=$c";
}

        传值时按照「参数位置顺序传递」。不存在跳过第二个参数,直接给第三个参数赋值。

  print(joint());//a=null,b=null,c=null
  //默认给第一个参数
  print(joint("1"));//a=1,b=null,c=null
  //给前两个参数
  print(joint("22","11"));//a=22,b=11,c=null
  //给三个参数
  print(joint("11","33","25"));//a=11,b=33,c=25

默认参数值

        在定义方法的时候,可选参数可以使用 = 来定义可选参数的默认值。

void userInfo({String name = "scc", int age = 15}) {
  print("姓名:$name,年龄:$age");
}

        如果不设置值,则直接使用默认值。

  userInfo();//姓名:scc(默认值),年龄:15(默认值)
  userInfo(age: 18);//姓名:scc(默认值),年龄:18
  userInfo(name: "dart",age: 3);//姓名:dart,年龄:3

不推荐: 旧版本代码中可能使用的是冒号 (:) 而不是 = 来设置参数默认值。 原因是起初命名参数只支持 : 。 这种支持可能会被弃用。 建议 使用 = 指定默认值。

匿名方法

​        没有名字的方法,称之为匿名方法,也可以称之为 lambda 或者 closure 闭包。匿名方法的声明为:

([Type] param1, …) { 
  codeBlock; 
}; 

例如:

  var list = ['apples', 'oranges', 'grapes', 'bananas', 'plums'];
  list.forEach((item) {
    print('${list.indexOf(item)}: $item');
  });

函数是一等对象

        一个函数可以作为另一个函数的参数。 例如:

var list = [1,2,3];
//将 print 方法 作为参数传递给forEach
list.forEach(print);
//可以将方法赋值给一个变量 类型为Funcation
var p = print;
list.forEach(p);

异常

        和 Java 不同的是,所有的 Dart 异常是非检查异常。 方法不一定声明了他们所抛出的异常, 并且不要求你捕获任何异常。

        Dart 提供了 ExceptionError 类型, 以及一些子类型。你还 可以定义自己的异常类型。但是, Dart 代码可以 抛出任何非 null 对象为异常,不仅仅是实现了 Exception 或者 Error 的对象。

throw new Exception('这是一个异常');
throw '这是一个异常';
throw 123;

        与Java不同之处在于捕获异常部分,Dart中捕获异常同样是使用catch语句,但是Dart中的catch无法指定异常类型。需要结合on来使用,基本语法如下:

try {
 throw 123;
} on int catch(e){
 //使用 on 指定捕获int类型的异常对象       
} catch(e,s){
    //函数 catch() 可以带有一个或者两个参数, 第一个参数为抛出的异常对象, 第二个为堆栈信息 ( StackTrace 对象)
    rethrow; //使用 `rethrow` 关键字可以 把捕获的异常给 重新抛出
} finally{
 
}

猜你喜欢

转载自blog.csdn.net/g984160547/article/details/131351348