That's just how it is, eg
SQL> select nvl(1,'X') from dual;
select nvl(1,'X') from dual
*
ERROR at line 1:
ORA-01722: invalid number
You can work around this with COALESCE but there's two things at play here
1) consistency of data types
2) evaluation of expressions
If you dont keep datatype consistency, you can still get into trouble:
SQL> select coalesce(1,'X') from dual;
select coalesce(1,'X') from dual
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
but if you do have consistent datatypes (which I imagine you should) then things will work out
SQL> select nvl(1, 1/0) from dual;
select nvl(1, 1/0) from dual
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
SQL> select coalesce(1, 1/0) from dual;
COALESCE(1,1/0)
---------------
1