杂糅-assert断言



assert 是断言, 用的最多的就是测试了,譬如单元测试。

断言看作是异常处理的一种高级形式。

spring源码里用的比较多,比如利用cookie自动登录时,cookie保存了用户名,和密码,

这个cookie就只有两个元素,我断言一下,如果取到的对应的cookie里的对象的元素不是两个,

那么直接抛异常,或者不往下处理了。


assert关键字语法很简单,有两种用法:

1、assert

如果为true,则程序继续执行。

如果为false,则程序抛出AssertionError,并终止执行。

2、assert : <错误信息表达式>

如果为true,则程序继续执行。

如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。




//断言1结果为true,则继续往下执行

asserttrue;

System.out.println("断言1没有问题,Go!");

System.out.println("\n-----------------\n");

//断言2结果为false,程序终止

assertfalse:"断言失败,此表达式的信息将会在抛出异常的时候输出!";

System.out.println("断言2没有问题,Go!");



从JDK1.4版本开始,Java语言引入了断言(assert)机制。目的:程序调试

测试代码或者调试程序时,总会做出一些假设,断言就是用于在代码中捕捉这些假设

表现形式:断言就是程序中的一条语句,它对一个boolean表达式进行检查

一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态,系统给出警告或退出

如果没有断言机制,Java程序通常使用if-else或switch语句进行变量状态检查。

缺点:

由于检查的数据类型不完全相同,这样的语句形式不会统一。

因为检查仅仅是应用在测试阶段,而if-else或switch语句在发布以后仍然将起作用,如果消除这些代码就意味着要注释或者删除这些代码,如果这些代码量很大就意味着工作很繁重并存在风险。

断言的优点

Java程序员用统一的方式处理状态检查问题;

断言只需在发行的时候关闭该功能即可。

断言的开启和关闭

在默认情况下断言是关闭的,因此在使用断言以前,需要先开启断言功能,方法:

java –ea MyClass                          或者

java –enableassertions MyClass

关闭断言功能的方法:

java –da MyClass                           或者

java –disableassertions MyClass

注意:断言检查通常在开发和测试时开启。为了提高性能,在软件发布后,断言检查通常是关闭的

断言的使用

Java中使用关键字assert标记断言,语法格式为:

assert Expression1

执行到assert语句时,如果Expression1的值为true,则程序正常执行,如果值为false,该语句创建一个Assertion Error对象,并抛出该对象。

assert Expression1:Expression2

断言失败时,系统会自动将Expression2的值传递给新建的AssertionError对象,进而将其转换为一个消息字符串保存起来,可以获得更多、更有针对性的检查失败细节信息。

什么时候使用断言

通常来说,断言用于检查一些关键的值,并且这些值对整个程序,或者局部功能的完成有很大的影响。

断言表达式应该短小、易懂,如果需要评估复杂的表达式,应该使用函数计算。

使用断言的情况

检查控制流:在if-else和switch语句中,可以在不应该发生的控制支流上加上assert语句。如果这种情况发生了,assert能够检查出来。

在私有方法计算前,检查输入参数是否有效

对于一些private的方法,要求输入满足一些特定的条件,可以在方法开头使用assert进行参数检查;对于公共方法,通常不使用断言检查

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果水印信息杂糅在音频中,那么我们需要先确定水印信息的位置,在音频中提取出水印信息的二进制数据,再将其转换为音频格式。这个过程需要使用水印嵌入时的位置和算法来确定水印信息的位置,然后再进行提取。 以下是一个示例代码,用于从音频C中提取出水印信息: ```matlab % 读取音频C [c, fs_c] = audioread('audio_c.wav'); % 确定水印信息的位置 start_pos = 100000; % 假设水印信息从第100000个采样点开始 binary_a_len = 1024; % 假设水印信息的长度为1024位 % 从音频C中提取出水印信息的二进制数据 binary_extracted = dec2bin(typecast(c(start_pos:start_pos+binary_a_len-1), 'uint16')); % 将提取出的二进制数据重新转换为音频D uint16_extracted = uint16(bin2dec(binary_extracted)); d = typecast(uint16_extracted, 'double'); d = reshape(d, [binary_a_len/2, 2]); % 假设音频C是双声道,因此需要将提取出的数据重新reshape为2列 % 将提取出的音频D保存为文件 audiowrite('watermark_extracted.wav', d, fs_c); ``` 在这个示例代码中,我们假设已经知道水印信息从第100000个采样点开始,长度为1024位,因此我们可以从音频C中提取出这部分二进制数据,然后将其转换为音频D。具体来说,我们使用`typecast`函数将音频C的一部分数据转换为`uint16`类型的数据,然后使用`dec2bin`函数将其转换为二进制数据。然后我们将提取出的二进制数据重新转换为音频D,并使用`audiowrite`函数将其保存为文件。 需要注意的是,以上代码中的假设可能不适用于所有情况,实际应用中需要根据具体情况进行调整。如果无法确定水印信息的位置,或者需要提取出非连续的水印信息,则需要使用更复杂的提取算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值