有没有办法自动检查元素错误?

时间:2016-04-19 12:23:28

标签: java

如果我们有太多代码,而你使用Java类,我们应该控制任何输入数据。

所以,如果按照例子......

People people[];
for(int i=0 ; i<=person_name.length ; i++) {
   people[i].getName(); 
   //This will obviously make a NullPointerException.
}

我们解决了这个问题:

People people[] = new People[5];
for(int i=0 ; i<=person_name.length ; i++) {
   people[i] = new People("Dude "+i);
   people[i].getName(); 
   //This will obviously make an ArrayIndexOutOfBounds.
}

所以我们再次修复它:

People people[] = new People[5];
for(int i=0 ; i<person_name.length ; i++) {
   people[i] = new People("Dude "+i);
   people[i].getName(); 
   //Perfect!
}

我知道这看起来很愚蠢,因为在编程中要记住这是正常的事情,但是,我们的事情是让我们的生活更轻松,所以...它可能在哪里?

1 个答案:

答案 0 :(得分:0)

您的错误可能是:

  • 语法错误 - 这些由编译器检查

  • 语义错误 - 编译器无法检查这些错误,编译器不知道您尝试在代码中实现了什么。

有两种方法可以减少语义错误的可能性:

使用高级语言结构

例如,代替for循环使用for-each循环来避免变量命名和开始和结束索引的可能错误:

考虑:

for(int i=0 ; i<=person_name.length ; i++) {
   people[i].getName(); 
   //This will obviously make a NullPointerException.
}

更短更安全:

for(Person person:persons) {
   person.getName(); 
}

GoF设计模式中有很多高级技巧。例如,使用构建器模式而不是伸缩构造函数可以帮助您避免滥用参数:

class Person {
   public Person(String name,String address,String email) {
   ...
   }
}

允许您在语法上正确但在语义上错误地使用:

new Person("John","a@b.com","New York") 

or 

new Person("a@b.com","New York","John") 

您可以通过引入您自己的域内特定数据类型的内置验证程序来编程非常安全,或者在DDD样式编程中强制执行不变量。

然而,这些超出了简单答案的范围:)

使用静态代码分析器

一组好的人为错误实际上很容易被工具检测到。这些代码分析器会检查您的源代码,如果检测到某些异味,还会添加更多错误和警告。

PMD,FindBugs,Sonar是检查代码质量和实施可靠编码标准的工具。

没有人可以阻止你

...制作糟糕的代码:) Java是第三代语言,允许您对数组和数据结构进行相当低级别的访问。因此,您可以创建一个Java程序 - 尽管它是用Java编写的 - 在编码质量上类似于C或Fortran程序。

滥用高级语言实际上是我在许多程序员中发现的常见模式。这样做的原因是它们可能来自低级语言(汇编,C)的背景,或者它们已经在Java中使用 Java而不是思考进行了

  

此外,确定的Real Programmer可以编写FORTRAN程序   任何语言。   ......取自:http://web.mit.edu/humor/Computers/real.programmers