A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵永生 中级黑马   /  2014-2-24 22:22  /  1352 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

听听大家对断言的解释,个人表达能力不是很好,大家都发表下看法,借鉴一下。谢谢了 呵呵

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

4 个回复

倒序浏览
你说的断言,是反射里的带有Declared的方法吗?如果是这个,就是说你只要声明了的,不管私有非私有,统统解剖出来

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
强制的,暴力的,不民主的,打破了常规的.

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
心是你仰望的城 来自手机 中级黑马 2014-2-25 08:43:10
板凳
断言(assert)用来测试,调试代码,断言以异常的方式去执行,不能继承性的打开。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
所谓断言(assertion)是一个Java语句,布尔表达式,程序员认为在程序执行时该表达式的值应该为true。系统通过计算该布尔表达式执行断言,若该表达式为false系统会报告一个错误。
1、断言是通过assert关键字来声明的,断言功能的使用有两种格式:
assert expression ;     或者   assert expression : detailMessage ;
其中,expression为布尔表达式,detailMessage是基本数据类型或Object类型的值。当断言语句被执行时,Java计算expression的值,如果其值为false,抛出AssertionError异常。AssertionError类有一个默认的构造方法和七个重载的构造方法,它们有一个参数,类型分别为:intlongfloatdoublebooleancharObject。对于第一种断言语句没有详细信息,Java使用AssertionError类默认的构造方法。对于第二种带有一个详细信息的断言语句,将使用AssertionError类的与消息的数据类型匹配的构造方法。由于AssertionError类是Error类的子类,当断言为false时,程序将在控制台显示一条消息并终止程序的执行。
下面是一个使用断言的例子。
public class AssertionDemo
{
   public static void main(String[]args)
{
      int i; int sum=0;
      for(i=0;i<10;i++)
                  sum+=i;
      assert i==10;
      assert sum>10&&sum<5*10:"sum is "+sum;
   }
}

上述程序中语句assert i==10断言i的值为10,如果i的值不为10将抛出AssertionError异常。语句assert sum>10&&sum<5*10:"sum is "+sum断言sum<5*10,如果为false,将抛出带有消息"sum is "+sum的AssertionError异常。
假如现在错误地输入了i<100而不是i<10,就会抛出下面的AssertionError异常:
Exception in thread “main” java.lang.AssertError
at AssertionDemo,main(AssertionDemo.java:7)
假如将sum+=i 错误地输入了sum+=1,就会抛出下面的AssertionError异常:
Exception in thread “main” java.lang.AssertError:sum is 10 at AssertionDemo,main(AssertionDemo.java:7)

2、启动和关闭断言功能
默认情况下,断言功能是关闭的。有两个命令行开关可以启用和关闭断言功能。为了使字节码编译器接受含有断言的代码,必须在编译命令中使用 –source 1.4选项。
javac –source 1.4  AssertionDemo.java
缺省情况下,断言机制在运行时是关闭的,要打开断言功能,在运行程序时需要使用 –enableassertions或-ea选项,例如:java –ea AssertionDemo
断言还可以在类的级别或包的级别打开或关闭。关闭断言的选项为-disableassertions或-da。例如,下面的命令在包package1的级别打开断言,而在Class1类上关闭断言:
java –ea:package1 –da:Class1 AssertionDemo。

3、使用异常处理或断言
断言不应该代替异常处理。异常处理主要处理程序运行时的非正常环境,断言主要是保证程序的正确性。异常处理实现程序的健壮而断言实现程序正确。与异常处理一样,断言并不用来一般的测试,而是保证内部一致性和有效性检查。断言在运行时被检查,在启动时可以打开或关闭。
不要在public方法中使用断言进行参数检查。传递给public方法的合法参数被认为方法的契约的一部分。不管断言是否打开,必须该服从该契约。例如,下面代码应该用异常处理重写。
public void setRadius(double newRadius)
{
        assert newRadius >= 0;
        radius = newRadius;
}
通常使用断言替换代码中的断言,例如下面的代码:
if(even){   …   }
else{   …    } //even is false
可以被替换成:
if(even){   …    }
else{   assert !even;   …   }
下面的代码:
if(numOfDollars > 1){   …    }
else(numOfDollars == 1){   …   }
可以被替换成:
if(numOfDollars > 1){   …    }
else(numOfDollars == 1){  …    }
else  assert false:numOfDollars;
另一个经常使用断言的地方是在switch语句中的default情况中,例如:
switch(month)
{
   case 1: …; break;
   case 2: …; break;
   …
   case 12: …; break;
   default:assert false:”Invalid month:” + month;
}

4、通过编程启用断言
除了从命令行启用断言检查之外,您也可以通过编程启用(或禁用)检查。由于这仅影响将来装入的类,因此不能随意地关闭或打开它。
类的 ClassLoader 使用下面四种方法控制断言的启用和禁用:
1)public void setDefaultAssertionStatus(boolean enabled) : 该方法设置由类装入器装入的包和类的缺省状态。可以通过设置特定的包和类选项来覆盖该设置。
2)public void setPackageAssertionStatus(String packageName, boolean enabled) :要覆盖包和其所有的子包的状态,传入包名和启用状态。
3)public void setClassAssertionStatus(String className, boolean enabled) :要覆盖特定类的状态,传入全限定类名和启用状态。
4)public void clearAssertionStatus() :该方法将所有包和类的设置重设为 false,然后将类装入器也重设为 false。
例如:
public class ClassLoaderAssert
{
        public static void main(String[] args)
        {         
                ClassLoaderAssert.class.getClassLoader().setDefaultAssertionStatus(true);// 将不会被执行
                assert false : "8888";  // (1)
                new AssertionDemo().main(new String[2]);  
        }
}
在上面的代码中将只执行AssertionDemo.java中的断言而不执行 (1) 所表示的断言


评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马