Hello everyone, this is the first time I post something on HashNode. This article will talk about common mistakes with Java.
I was a little skeptical about what I wrote, whether it was too normal or I was just overreacting. However, I still write it here and hope it will help someone. Thanks.
1. Compare real numbers
In general, in most programming languages, comparing the results of real numbers should be avoided. Here's a very simple example.
System.out.println(0.1 + 0.2 == 0.3); // false
This problem has to do with the representation of real numbers in binary. In summary, always remember calculation with real numbers is always not really accurate and should be limited (although there are standard libraries that deal with this problem).
2. How to compare StringBuilder?
How do you check two String objects have the same content? Use equals()
method instead of ==
, right?
How about the same question but with StringBuilder?
StringBuilder a = new StringBuilder("Hello");
StringBuilder b = new StringBuilder("Hello");
a.equals(b); // true or false?
The result is false
because the StringBuilder class does not implement its equals()
method. So you need to call both's toString()
before equals()
.
a.equals(b); // false
a.toString().equals(b.toString()); // true
3. Foreach with null
Collection
Okay, this can be considered a best practice and is often said many times. In particular, you should return an empty collection instead of null
.
Try this example.
List<Integer> primes = null;
// Yeah, we got a NullPointerException
for (Integer prime : primes)
// Do something
Sometimes, I wonder why java doesn't simply skip the loop in this case. On the other hand, I find this quite good, when it helps us to write better code, just a bit annoying.
4. Use a primitive variable to iterate through a Collection
Have you ever code like this?
Collection<Integer> list = new ArrayList<>(List.of(2, 3, 5, 7));
// Iterate with foreach
for (int element : list)
// Do something with element
// Or using iterator
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
int element = iterator.next();
// Do something with element
}
But what's wrong with the above code? Let's me explain, there are two points to remember:
- Most Collection classes allow
null
element - Unboxing process may produce
NullPointerException
Yeah, you got it. When Java tries to unbox a wrapper variable, it may get a NullPointerException
.
Just limit the use of primitive variables and use wrapper types instead. Of course, it doesn't completely fix the error, we still need some additional null checks.
5. Forget check null
with wrapper type
Some situations require you to do an explicit null check but are sometimes ignored.
As mentioned above, the variable representing the elements of almost Collection can be contain null
value. So make sure you keep this under control.
Another case is to use Boolean in the conditional expression but not check for null.
Boolean b = null;
if (b)
System.out.println("Okay");
You get a NullPointerException
for forgetting to do a null check.
if (b != null && b)
// This is better
I'm tired of null checks. Better to do this.
if (b == Boolean.TRUE)
// Now null check is unnecessary
6. Try to modify an immutable collection
When I first learned java, I used to code like this.
// Arrays.asList(), List.of(), etc
List<Integer> a = Arrays.asList(2, 3, 5, 7);
List<Integer> b = List.of(2, 3, 5, 7);
// And this will throw an exception
a.add(11);
Until I got the UnsupportedOperationException
error. This is easy to understand since the above static methods always return an unmodifiable collection.
Therefore, if I try to add or remove an element, the above exception is thrown.
List<Integer> a = new ArrayList<>(List.of(2, 3, 5, 7));
a.add(11);
The code will be a bit longer but totally works.
Okay, that's all. Thank you for taking the time to read my post. If it is useful to you, please like or share.
Ps: I don't know if I should add the 7th mistake to this post. My article uses an image on Google as a cover. I wonder if that's legal, let me know in the comments. Thanks.