旗下导航:搜·么
当前位置:网站首页 > JAVA教程 > 正文

java几种罕见毛病引见【JAVA教程】,java

作者:搜教程发布时间:2019-12-24分类:JAVA教程浏览:80评论:0


导读:java罕见毛病:1、空指针毛病在java数组的运用中,有时刻需要对字符串数组中的元素举行对照。那末当元素不为null时,顺序会一般运转;然则,一旦对照的元素为null...

java罕见毛病:

1、空指针毛病

在java数组的运用中,有时刻需要对字符串数组中的元素举行对照。那末当元素不为null时,顺序会一般运转;然则,一旦对照的元素为null,那末顺序就会涌现空指针毛病。

解决要领:到场庇护,当元素不为null时在举行推断。

public static void main(Sring[] args){
  String [] sums = "adfafA";
  for(int i=0;i<sums.length;i++){
    if(sums[]!=null && sums[i].equals(sr)){
      System.out.println("找到元素"+sums[i]);
      break;
    }
  }
}

2、数据的精度局限与范例转换

在Java中有4种基本范例数据:

整型: -1 2 3 4 ……

浮点型:float 1.3f ; double 3.2 3.5d (未标明范例,默许最高精度)

字符型:采纳Unicode编码,2字节

布尔型:true、false

四种基本范例数据的精度局限各不相同,逐级提拔。

假如在运用数据范例时,不注意精度局限,就会涌现数据溢出,从而发作计算毛病。

四种基本范例中,整型,浮点型和字符型数据是能够互相转化的。

转换划定规矩以下:

①隐形转换:精度小的数据值,赋值给精度大的值,能够自动转换。(初级向高等)

②强迫转换:局限大的数据值,(高等到初级)

③运算自动提拔划定规矩:运算中,自动转换为精度高的数据范例。

3、三种轮回的运用

①for 轮回:是一种有限次数的轮回,在轮回前,规定好轮回次数。

for(表达式;表达式;表达式){
        轮回体
 }

break语句:实行后,马上跳出轮回,不在实行背面的语句,且完毕一切轮回。

continue 语句:实行后,马上跳出当前单词轮回,从新推断前提是不是继承循。

②While轮回语句:合适未知次数的轮回。

while(前提表达式){
  语句
 };

③do-While轮回:也是未知次数的轮回。单最少要先实行一次do,在推断。假如while建立,继承轮回,反之,完毕轮回。

do {
 语句
 }while(前提表达式);

4、屡次拷贝字符串

测试所不能发明的一个毛病是生成不可变(immutable)对象的多份拷贝。不可变对象是不可转变的,因而不需要拷贝它。最经常使用的不可变对象是String。

假如你必需转变一个String对象的内容,你应当运用StringBuffer。下面的代码会一般事变:

String s = new String ("Text here");

然则,这段代码机能差,而且没有必要这么庞杂。你还能够用以下的体式格局来重写上面的代码:

String temp = "Text here";
String s = new String (temp);

然则这段代码包含分外的String,并不是完全必要。更好的代码为:

String s = "Text here";

5、没有克隆(clone)返回的对象

封装(encapsulation)是面向对象编程的主要观点。不幸的是,Java为不警惕突破封装供应了轻易——Java许可返回私有数据的援用(reference)。下面的代码展现了这一点:

import java.awt.Dimension;
  /***Example class.The x and y values should never*be negative.*/
  public class Example{
  private Dimension d = new Dimension (0, 0);
  public Example (){ }
  /*** Set height and width. Both height and width must be nonnegative * or an exception is thrown.*/
  public synchronized void setValues (int height,int width) throws IllegalArgumentException{
  if (height <0 || width <0)
  throw new IllegalArgumentException();
  d.height = height;
  d.width = width;
  }
  public synchronized Dimension getValues(){
  // Ooops! Breaks encapsulation
  return d;
  }
  }

Example类保证了它所存储的height和width值永久非负数,试图运用setValues()要领来设置负值会触发非常。不幸的是,因为getValues()返回d的援用,而不是d的拷贝,你能够编写以下的破坏性代码:

  Example ex = new Example();
  Dimension d = ex.getValues();
  d.height = -5;
  d.width = -10;

如今,Example对象具有负值了!假如getValues() 的调用者永久也不设置返回的Dimension对象的width 和height值,那末仅凭测试是不可能检测到这类的毛病。

不幸的是,跟着时刻的推移,客户代码可能会转变返回的Dimension对象的值,这个时刻,追随毛病的泉源是件死板且费时的事变,尤其是在多线程环境中。

更好的体式格局是让getValues()返回拷贝:

  public synchronized Dimension getValues(){
  return new Dimension (d.x, d.y);
  }

6、拷贝毛病的数据

有时刻顺序员晓得必需返回一个拷贝,然则却不警惕拷贝了毛病的数据。因为仅仅做了部份的数据拷贝事变,下面的代码与顺序员的企图有误差:

import java.awt.Dimension;
  /*** Example class. The height and width values should never * be
  negative. */
  public class Example{
  static final public int TOTAL_VALUES = 10;
  private Dimension[] d = new Dimension[TOTAL_VALUES];
  public Example (){ }
  /*** Set height and width. Both height and width must be nonnegative * or an exception will be thrown. */
  public synchronized void setValues (int index, int height, int width) throws IllegalArgumentException{
  if (height <0 || width <0)
  throw new IllegalArgumentException();
  if (d[index] == null)
  d[index] = new Dimension();
  d[index].height = height;
  d[index].width = width;
  }
  public synchronized Dimension[] getValues()
  throws CloneNotSupportedException{
  return (Dimension[])d.clone();
  }
  }

这儿的问题在于getValues()要领仅仅克隆了数组,而没有克隆数组中包含的Dimension对象,因而,虽然调用者没法转变内部的数组使其元素指向差别的Dimension对象,然则调用者却能够转变内部的数组元素(也就是Dimension对象)的内容。要领getValues()的更好版本为:

 public synchronized Dimension[] getValues() throws CloneNotSupportedException{
  Dimension[] copy = (Dimension[])d.clone();
  for (int i = 0; i
  // NOTE: Dimension isn’t cloneable.
  if (d != null)
  copy[i] = new Dimension (d[i].height, d[i].width);
  }
  return copy;
  }

在克隆原子范例数据的多维数组的时刻,也会犯相似的毛病。原子范例包含int,float等。简朴的克隆int型的一维数组是准确的,以下所示:

 public void store (int[] data) throws CloneNotSupportedException{
  this.data = (int[])data.clone();
  // OK
  }

拷贝int型的二维数组更庞杂些。Java没有int型的二维数组,因而一个int型的二维数组实际上是一个如许的一维数组:它的范例为int[]。简朴的克隆int[][]型的数组会犯与上面例子中getValues()要领第一版本一样的毛病,因而应当防止这么做。下面的例子演示了在克隆int型二维数组时毛病的和准确的做法:

public void wrongStore (int[][] data) throws CloneNotSupportedException{
  this.data = (int[][])data.clone(); // Not OK!
  }
  public void rightStore (int[][] data){
  // OK!
  this.data = (int[][])data.clone();
  for (int i = 0; i
  if (data != null)
  this.data[i] = (int[])data[i].clone();
  }
  }

更多java学问请关注java基本教程栏目。

以上就是java几种罕见毛病引见的细致内容,更多请关注ki4网别的相干文章!

标签:java


欢迎 发表评论: