Heim >Java >javaLernprogramm >Häufige Fragen und Antworten zu Fallen in Java
1. Ungerade Zahlen finden:
public static boolean isOdd(int i){ return i % 2 == 1; }
Kann die obige Methode wirklich alle ungeraden Zahlen finden?
A: Das Problem der negativen Zahlen wird nicht berücksichtigt. Wenn i negativ ist, ist es falsch. Sollte i%2 == 0 zurückgeben
2. Gleitkommasubtraktion
System.out.println(2.0-1.9);
A: Die einfachen Gleitkommatypen float und double in Java können nicht betrieben werden. Nicht nur Java, sondern auch viele andere Programmiersprachen haben dieses Problem. In den meisten Fällen sind die Berechnungsergebnisse korrekt, aber wenn Sie es ein paar Mal versuchen (Sie können eine Schleife erstellen), können Sie Fehler wie die oben genannten machen. Natürlich kann es bei Addition, Subtraktion, Multiplikation und Division zu Problemen kommen.
Zum Beispiel:
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);
Dies liegt daran, dass einige Dezimalzahlen mit einer begrenzten Anzahl von Stellen zu unendlich wiederkehrenden Dezimalzahlen werden können Binärzahlen können nicht dargestellt werden und die Genauigkeit ist beeinträchtigt.
Lösung:
1. Wenn Sie feststellen möchten, ob a-b gleich c ist oder ob a+b gleich c ist, können Sie
if(0.05+0.01-0.06 < 0.0000001) { }
verwenden 2. In „Effektiv“ Ein im Buch „Java“ erwähntes Prinzip ist, dass Float und Double nur für wissenschaftliche Berechnungen oder technische Berechnungen verwendet werden können. In kommerziellen Berechnungen müssen wir java.math.BigDecimal verwenden, um
System.out.println((new BigDecimal("2.0")).subtract( new BigDecimal("1.9")).doubleValue());3 . Endlosschleife
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); }A: Der Grund für die Endlosschleife hier ist, dass, wenn i gleich Integer.MAX_VALUE ist, die for-Schleife zuerst ++ ist und dann bestimmt, ob i < ist ;=END. Wenn i eine ganze Zahl ist. Wenn .MAX_VALUE in ++ geändert wird, wird i zu einer negativen Zahl. Der Zyklus geht also weiter.
Der Grund, warum es eine negative Zahl wird, ist, dass int überläuft. Hier kann das Problem durch Ändern von <=END in
public static boolean decision() { try { return true; } finally { return false; } }A: Rückgabe falsch. Zu diesem Zeitpunkt ist return true eine nicht erreichbare Anweisung und wird während der Kompilierungsphase optimiert und entfernt. 3. Lassen Sie uns einige Fallenfragen teilen, auf die Sie in Interviews stoßen könnten Sehen Sie sich den Code an:
int a=5; System.out.println("value is"+((a<5)? 10.9:9 ));Das Ausgabeergebnis ist:
value is9.0Weil ((a<5) ? 10.9) es eine 10.9java-automatische Transformation gibt, die auf der Operatorgenauigkeit basiert. Daher werden die folgenden 9 auch zu 9.0.
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"); }
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"); }Das Ergebnis ist:
fa!=fb fa.equalfb db!equalfb Float 型与Double 型肯定不相等Wenn Sie noch etwas haben, können Sie es gerne hinzufügen. Referenz: 1. http://blog.csdn.net/ol_beta/article/details/5598867