Maison > Java > javaDidacticiel > le corps du texte

Questions et réponses sur les pièges courants en Java

高洛峰
Libérer: 2017-01-16 16:20:18
original
1669 Les gens l'ont consulté

1. Trouver les nombres impairs :

public static boolean isOdd(int i){
 return i % 2 == 1;
 }
Copier après la connexion

La méthode ci-dessus peut-elle vraiment trouver tous les nombres impairs ?

A : Le problème des nombres négatifs n'est pas pris en compte. Si i est négatif, il est incorrect. Doit renvoyer i%2 == 0

2. Soustraction à virgule flottante

System.out.println(2.0-1.9);
Copier après la connexion

A : Les types à virgule flottante simples float et double en Java ne peuvent pas être utilisés. Non seulement Java, mais aussi de nombreux autres langages de programmation ont ce problème. Dans la plupart des cas, les résultats du calcul sont précis, mais si vous essayez plusieurs fois (vous pouvez faire une boucle), vous pouvez commettre des erreurs comme celle ci-dessus. Bien sûr, il peut y avoir des problèmes avec l'addition, la soustraction, la multiplication et la division

Par exemple :

System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);
Copier après la connexion

En effet, certaines décimales avec un nombre limité de chiffres peuvent devenir des décimales infiniment récurrentes. en binaire. Les nombres à virgule flottante ne peuvent pas être représentés et la précision est compromise.

Solution :

1. Si vous souhaitez déterminer si a-b est égal à c, ou si a b est égal à c, vous pouvez utiliser

if(0.05+0.01-0.06 < 0.0000001)
{
}
Copier après la connexion

2. Dans "Effective Java" Un principe mentionné dans ce livre est que float et double ne peuvent être utilisés que pour des calculs scientifiques ou techniques. Dans les calculs commerciaux, nous devons utiliser java.math.BigDecimal pour résoudre

System.out.println((new BigDecimal("2.0")).subtract(
 new BigDecimal("1.9")).doubleValue());
Copier après la connexion
<🎜. >3. Boucle infinie

public static final int END = Integer.MAX_VALUE;
 public static final int START = END - 2;
 
 public static void main(String[] args) {
 int count = 0;
 for (int i = START; i <= END; i++)
 count++;
 System.out.println(count);
 }
Copier après la connexion
A : La raison de la boucle infinie ici est que lorsque i est Integer.MAX_VALUE, la boucle for détermine d'abord si i est <=END, puis quand i est Integer.MAX_VALUE , i devient un nombre négatif. Le cycle continue donc.

La raison pour laquelle il devient un nombre négatif est que int déborde. Ici, changer <=END en

4. Qu'est-ce qui est retourné exactement ?

public static boolean decision() {
 try {
 return true;
 } finally {
 return false;
 }
}
Copier après la connexion
A : Renvoyer faux. Pour le moment, return true est une instruction inaccessible et sera optimisée et supprimée lors de la phase de compilation.

3. Partageons quelques questions pièges que vous pourriez rencontrer lors des entretiens

Regardez le code :

int a=5;
  System.out.println("value is"+((a<5)? 10.9:9 ));
Copier après la connexion
Le résultat de sortie est :


A. Erreur de compilation B10.9 C.9 D Aucune des réponses ci-dessus n'est correcte.


Le résultat de l'exécution est :

value is9.0
Copier après la connexion
Parce que ((a<5) ? 10.9) il existe une transformation automatique Java 10.9 basée sur la précision de l'opérateur. Par conséquent, le 9 suivant deviendra également 9,0.


Alors choisissez D.


a

StringBuffer str1=new StringBuffer("123");
  StringBuffer str2=new StringBuffer("123");
  if(str1.equals(str2)){
   System.out.println("str1.equalstr2");
  }else{
   System.out.println("str1.notequalstr2");
  }
Copier après la connexion


Le résultat est : str1.notequalsstr2 Cela montre que StringBuffer ne remplace pas la méthode égale.

Float fa=new Float(0.9f);
  Float fb=new Float(0.9f); //Float fb=new Float("0.9f");
  Double db=new Double(0.9f);
  if(fa==fb){ //false
   System.out.println("fa==fb");
  }else{
   System.out.println("fa!=fb");
  }
  if(fa.equals(fb)){ //true
   System.out.println("fa.equalfb");
  }else{
   System.out.println("fa!equalfb");
  }
  if(db.equals(fb)){ //false
   System.out.println("db.equalfb");
  }else{
   System.out.println("db!equalfb");
  }
Copier après la connexion
Le résultat est :

fa!=fb
fa.equalfb
db!equalfb Float 型与Double 型肯定不相等
Copier après la connexion
Si vous avez autre chose, n'hésitez pas à l'ajouter.

Référence :

1. http://blog.csdn.net/ol_beta/article/details/5598867


2. baidu.com/link?url=0UyDU42L7DXZitdydJMG3IIUDIf3xidFCRAObZAq6SHFCEaNnp2Oyuq1KVwBvmlR0UZGHSjD4f6A1yD0d65JL_

3. 🎜>4. http://z466459262.iteye.com/blog/ 739300

Résumé

Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article pourra apporter de l'aide aux études ou au travail de chacun. Si vous avez des questions, vous pouvez partir. un message à communiquer.

Pour plus d'articles sur les questions et réponses aux pièges courants en Java, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal