Это плохой подход… Ваш метод принимает сам не знает что. Методы instanceof , toString — очень медленные. Будете злоупотреблять ими — получите огромное падение производительности. Подумайте, какие типы может принимать ваш метод. Насколько я понял это Boolean и String. Отлично, так почему бы вам не перегрузить метод для этих типов?
public static Boolean convertToBoolean (Boolean value) {
return value == null ? false : value;
}
public static Boolean convertToBoolean (String value) {
if (value == null || value.isEmpty()) return false;
for (String arrayValue : TrueArray) {
if (value.equalsIgnoreCase(arrayValue)) return true;
}
return false;
}
Для сведения… value.equalsIgnoreCase(arrayValue) — это выражение при значении null в переменной value дает исключение, но если null будет в аргументах, т.е. в том случае в переменной arrayValue, то все нормально отработает. Следовательно, если ваш массив состоит из нескольких элементов и в него не могут попасть null, то проверку на null можно и не делать, просто изменить выражение в условии так arrayValue.equalsIgnoreCase(value).
Обратите внимание, что TrueArray — переменная, хранящая ссылку на массив, а переменные принято именовать с маленьких букв. Может Вам покажется это мелочью, но за это вообще-то отбивают руки и правильно делают…
ClassCastException in Java occurs when we try to convert the data type of entry into another. This is related to the type conversion feature and data type conversion is successful only where a class extends a parent class and the child class is cast to its parent class.
Here we can consider parent class as vehicle and child class may be car, bike, cycle etc., Parent class as shape and child class may be 2d shapes or 3d shapes, etc.
Two different kinds of constructors available for ClassCastException.
- ClassCastException(): It is used to create an instance of the ClassCastException class.
- ClassCastException(String s): It is used to create an instance of the ClassCastException class, by accepting the specified string as a message.
Let us see in details
Java
import
java.math.BigDecimal;
public
class
ClassCastExceptionExample {
public
static
void
main(String[] args)
{
Object sampleObject =
new
BigDecimal(
10000000.45
);
System.out.println(sampleObject);
}
}
Output
10000000.4499999992549419403076171875
If we try to print this value by casting to different data type like String or Integer etc., we will be getting ClassCastException.
Java
import
java.math.BigDecimal;
public
class
Main {
public
static
void
main(String[] args)
{
Object sampleObject =
new
BigDecimal(
10000000.45
);
System.out.println((String)sampleObject);
}
}
Output :
Exception in thread “main” java.lang.ClassCastException: class java.math.BigDecimal cannot be cast to class java.lang.String (java.math.BigDecimal and java.lang.String are in module java.base of loader ‘bootstrap’)
at Main.main(Main.java:11)
We can fix the exception printing by means of converting the code in the below format:
Java
import
java.math.BigDecimal;
public
class
ClassCastExceptionExample {
public
static
void
main(String[] args)
{
Object sampleObject =
new
BigDecimal(
10000000.45
);
System.out.println(String.valueOf(sampleObject));
}
}
Output
10000000.4499999992549419403076171875
So, in any instances when we try to convert data type of object, we cannot directly downcast or upcast to a specified data type. Direct casting will not work and it throws ClassCastException. Instead, we can use
String.valueOf() method. It converts different types of values like int, long, boolean, character, float etc., into the string.
- public static String valueOf(boolean boolValue)
- public static String valueOf(char charValue)
- public static String valueOf(char[] charArrayValue)
- public static String valueOf(int intValue)
- public static String valueOf(long longValue)
- public static String valueOf(float floatValue)
- public static String valueOf(double doubleValue)
- public static String valueOf(Object objectValue)
are the different methods available and in our above example, the last method is used.
Between Parent and Child class. Example shows that the instance of the parent class cannot be cast to an instance of the child class.
Java
class
Vehicle {
public
Vehicle()
{
System.out.println(
"An example instance of the Vehicle class to proceed for showing ClassCastException"
);
}
}
final
class
Bike
extends
Vehicle {
public
Bike()
{
super
();
System.out.println(
"An example instance of the Bike class that extends Vehicle as parent class to proceed for showing ClassCastException"
);
}
}
public
class
ClassCastExceptionExample {
public
static
void
main(String[] args)
{
Vehicle vehicle =
new
Vehicle();
Bike bike =
new
Bike();
Bike bike1 =
new
Vehicle();
bike = vehicle;
}
}
Compiler error :
In order to overcome Compile-time errors, we need to downcast explicitly. i.e. downcasting means the typecasting of a parent object to a child object. That means features of parent object lost and hence there is no implicit downcasting possible and hence we need to do explicitly as below way
Giving the snippet where the change requires. In the downcasting Explicit way
Java
class
Vehicle {
String vehicleName;
void
displayData()
{
System.out.println(
"From Vehicle class"
);
}
}
class
Bike
extends
Vehicle {
double
cost;
@Override
void
displayData()
{
System.out.println(
"From bike class"
+ cost);
}
}
public
class
ClassCastExceptionExample {
public
static
void
main(String[] args)
{
Vehicle vehicle =
new
Bike();
vehicle.vehicleName =
"BMW"
;
Bike bike = (Bike)vehicle;
bike.cost =
1000000
;
System.out.println(bike.vehicleName);
System.out.println(bike.cost);
bike.displayData();
}
}
Output
BMW 1000000.0 From bike class1000000.0
Upcasting implicit way
An example for upcasting of the child object to the parent object. It can be done implicitly. This facility gives us the flexibility to access the parent class members.
Java
class
Vehicle {
String vehicleName;
void
displayData()
{
System.out.println(
"From Vehicle class"
);
}
}
class
Bike
extends
Vehicle {
double
cost;
@Override
void
displayData()
{
System.out.println(
"From bike class..."
+ cost);
}
}
public
class
ClassCastExceptionExample {
public
static
void
main(String[] args)
{
Vehicle vehicle =
new
Bike();
vehicle.vehicleName =
"Harley-Davidson"
;
System.out.println(vehicle.vehicleName);
vehicle.displayData();
}
}
Output
Harley-Davidson From bike class...0.0
Fixing ClassCastException in an upcasting way and at the same time, loss of data also occurs
Java
class
Vehicle {
public
Vehicle()
{
System.out.println(
"An example instance of the Vehicle class to proceed for showing ClassCast Exception"
);
}
public
String display()
{
return
"Vehicle class display method"
;
}
}
class
Bike
extends
Vehicle {
public
Bike()
{
super
();
System.out.println(
"An example instance of the Bike class that extends \nVehicle as parent class to proceed for showing ClassCast Exception"
);
}
public
String display()
{
return
"Bike class display method"
;
}
}
public
class
ClassCastExceptionExample {
public
static
void
main(String[] args)
{
Vehicle vehicle =
new
Vehicle();
Bike bike =
new
Bike();
vehicle = bike;
System.out.println(
"After upcasting bike(child) to vehicle(parent).."
+ vehicle.display());
}
}
Output
An example instance of the Vehicle class to proceed for showing ClassCast Exception An example instance of the Vehicle class to proceed for showing ClassCast Exception An example instance of the Bike class that extends Vehicle as parent class to proceed for showing ClassCast Exception After upcasting bike(child) to vehicle(parent)..Bike class display method
Conclusion: By means of either upcasting or downcasting, we can overcome ClassCastException if we are following Parent-child relationships. String.valueOf() methods help to convert the different data type to String and in that way also we can overcome.
Last Updated :
12 Dec, 2022
Like Article
Save Article
Перечень наиболее часто встречающихся исключений (исключительных ситуаций, ошибок) в языке программирования java с расшифровкой их значения.
Зміст
- ArithmeticException
- ArrayIndexOutOfBoundsException
- ArrayStoreException
- ClassCastException
- ConcurrentModificationException
- EmptyStackException
- IllegalArgumentException
- IllegalMonitorStateException
- IllegalStateException
- IllegalThreadStateException
- IndexOutOfBoundsException
- MissingResourceException
- NegativeArraySizeException
- NoSuchElementException
- NullPointerException
- NumberFormatException
- SecurityException
- StringIndexOutOfBoundsException
- UndeclaredThrowableException
- UnsupportedOperationException
ArithmeticException
Возникла исключительная ситуация, связанная с ошибкой при выполнении арифметического вычисления (например, с попыткой целочисленного деления на нуль). Класс ArithmeticalException унаследован от RuntimeException.
ArrayIndexOutOfBoundsException
Задано значение индекса массива, не принадлежащее допустимому диапазону. Имеется дополнительный конструктор, принимающий в качестве параметра ошибочное значение индекса и включающий его в текст описательного сообщения. Класс ArrayIndexOutOfBoundsException унаследован от IndexOutOfBoundException
ArrayStoreException
Предпринята попытка сохранения в массиве объекта недопустимого типа. Возникает, если попытаться записать в ячейку массива ссылку на объект неправильного типа.
Класс ArrayStoreException унаследован от RuntimeException.
ClassCastException
Выполнена неверная операция преобразования типов (ошибка приведения типов).
Класс ClassCastException унаследован от RuntimeException.
ConcurrentModificationException
Осуществлена попытка изменения объекта конкурирующим потоком вычислений (thread) с нарушением контракта класса (тип определен в пакете jav.util).
Также исключение может происходить при работе с коллекциями при обычной однопоточной работе. ConcurrentModificationException возникает когда коллекция модифицируется «одновременно» с проходом по коллекции итератором любыми средствами кроме самого итератора.
Класс ConcurrentModificationException унаследован от RuntimeException.
EmptyStackException
Возникает при попытке извлечения объекта из пустого стека. Тип обладает только конструктором без параметров, поскольку причина ситуации очевидна без дополнительных разъяснений (тип определен в пакете java.util).
Класс EmptyStackExceptionунаследован от RuntimeException.
IllegalArgumentException
Методу передано неверное значение аргумента (например, отрицательное, когда метод предполагает задание положительных значений).
Класс IllegalArgumentExceptionунаследован от RuntimeException.
IllegalMonitorStateException
Выполнено обращение к методу wait, notifyAll или notify объекта, когда текущий поток вычислений не обладает блокировкой (lock) этого объекта.
Класс IllegalMonitorStateException унаследован от RuntimeException.
IllegalStateException
Предпринята попытка выполнения операции в то время, когда объект не находится в соответствующем состоянии (например при регистрации или удалении ловушки события закрытия исполняющей системы (shutdown hook) после начала процедуры закрытия).
Класс IllegalStateExceptionунаследован от RuntimeException.
IllegalThreadStateException
Предпринята попытка выполнения операции в то время, когда объект потока вычислений не находится в соответствующем состоянии (например, вызван метод start для потока, который уже приступил к работе).
Класс IllegalThreadStateException унаследован от IllegalArgumentException
IndexOutOfBoundsException
Задано значение индекса массива или содержимого строки типа String, не принадлежащее допустимому диапазону.
Класс IndexOutOfBoundsException унаследован от RuntimeException
MissingResourceException
Не найден требуемый ресурс или пакет ресурсов (resource bundle). Единственный конструктор типа предусматривает задание трех аргументов: строки описательного сообщения, наименования класса ресурсов и объекта ключа, отвечающего отсутствующему ресурсу. Для получения строк наименования класса и ключа применяются методы detClassName и getKey соответственно (тип определен в пакете java.util).
Класс MissingResourceExceptionунаследован от RuntimeException.
NegativeArraySizeException
Предпринята попытка создания массива с размером, значение которого задано отрицательным числом.
Класс NegativeArraySizeException унаследован от RuntimeException.
NoSuchElementException
Операция поиска элемента в объекте одного из контейнерных классов завершилась неудачей (тип определен в пакете java.util).
Класс NoSuchElementException унаследован от RuntimeException.
NullPointerException
Возникает при попытке обращения к полю, методу или объекту по ссылке, равной null. Также исключение выбрасывается, когда метод, не допускающий передачи аргумента null, был вызван с заданием значения null. В последнем случае может быть сгенерировано и исключение типа IllegalArgumentException.
Класс NullPointerException унаследован от RuntimeException.
NumberFormatException
Строка, которая, как предполагалось должна содержать представление числа, не отвечает этому требованию. Исключение выбрасывается такими методами, как, например, Integer.parseInt.
Класс NumberFormatException унаследован от IllegalArgumentException.
SecurityException
Предпринята попытка выполнения операции, запрещенной системой обеспечения безопасности в соответствии с действующей политикой безопасности.
Класс SecurityException унаследован от RuntimeException.
StringIndexOutOfBoundsException
Задано значение индекса содержимого строки типа String, не принадлежащее допустимому диапазону. Имеется дополнительный конструктор, принимающий в качестве параметра ошибочное значение индекса и включающий его в текст описательного сообщения.
Класс StringIndexOutOfBoundsException унаследован от IndexOutOfBoundsException.
UndeclaredThrowableException
Выбрасывается при обращении к методу целевого объекта посредством объекта рефлективного класса Proxy, если метод invoke объекта InvocationHandler генерирует объявляемое исключение, которое не допускает присваивания ни одному из типов исключений, упомянутых в предложении throws метода целевого объекта. Рассматриваемое исключение содержит ссылку на исключение, генерируемое методом invoke, которое может быть получено с помощью метода getUndeclaredThrowable. Класс исключений UndeclaredThrowableException поддерживает два конструктора: оба принимают в качестве параметров ссылку на объект Throwable, а один из них, помимо того, строку описания (тип определен в пакете java.lang.reflect).
Класс UndeclaredThrowableException унаследован от RuntimeException.
UnsupportedOperationException
Предпринята попытка выполнения операции над объектом, который ее не поддерживает (например, модификация объекта, обозначенного признаком “только для чтения”). используется также классами коллекций из состава пакета java.util как реакция на вызов методов производного класса, реализация которых не обязательна.
Класс UnsupportedOperationException унаследован от RuntimeException.
Смотрите также: Методы обработки исключений в java
Почему возникает Ошибка ПРИВЕДЕНИЯ ТИПОВ в строке
return (Integer[]) list.toArray();
public class Solution {
public static void main(String[] args) {
Integer[] arr = new Integer[]{13, 8, 15, 5, 17};
for(Integer i:sort(arr)){
System.out.println(i);
}
}
public static Integer[] sort(Integer[] array) {
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(array));
Collections.sort(list);
double mediana;
if (list.size()%2!=0) mediana = list.get(list.size()/2);
else mediana = ( list.get(list.size()/2) + list.get(list.size()/2-1) )*(1.0)/2;
Comparator<Integer> compAbs = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
double d1 = Math.abs(o1-mediana);
double d2 = Math.abs(o2-mediana);
return (d1 - d2)<0?-1:d1-d2==0?0:1;
}
};
Collections.sort(list,compAbs);
return (Integer[]) list.toArray();
}
}
А вот в этом примере Ошибки НЕТУ!!! Почему ее во втором примере нет, а впервом есть. Мы же в обеих случаях делаем ОПЕРАЦИЮ ПРИВЕДЕНИЯ К ТИПУ (Integer[])
public class Main {
public static void main(String[] args) {
List<Integer> wordsList = Arrays.asList(1,2,3,4);
Integer[] wordsArray = (Integer[]) wordsList.toArray();
for (Integer word : wordsArray) {
System.out.println(word);
}
}
}
What We Are Learn On This Post
ClassCastException In Java: In this post, we are going to discuss ClassCastException. A class cast exception is thrown by Java when you try to cast an Object of one data type to another. Java allows us to cast variables of one type to another as long as the casting happens between compatible data types.
ClassCastException In Java
As you can see in the above pic ClassCast-Exception exception extends the class RuntimeException and thus, belongs to those exceptions that can be thrown during the operation of the Java Virtual Machine (JVM). It is an unchecked exception and thus, it does not need to be declared in a method’s or a constructor’s throws clause.
java.lang.classcastexception In Java:
An object can be automatically upcasted to its superclass type. You need not mention class type explicitly. But, when an object is supposed to be downcasted to its subclass type, then you have to mention class type explicitly. In such a case, there is a possibility of occurring class cast exception. Most of the time, it occurs when you are trying to downcast an object explicitly to its subclass type.
package co.java.exception; public class ClassCast_Exception { public static void main(String[] args) { Object obj=new Object(); int i=(int) obj; System.out.println(i); } }
Lets Run The Above Program:
When we run the above program we got the below error:
Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.Integer at co.java.exception.ClassCastException.main(ClassCast-Exception.java:8)
Let’s take another example:
package co.java.exception; class Parent { public Parent() { System.out.println("An instance of the Parent class was created!"); } } final class Child extends Parent { public Child() { super(); System.out.println("An instance of the Child class was created!"); } } public class ClassCast-ExceptionExample { public static void main(String[] args) { Parent p = new Parent(); Child ch = new Child(); ch = (Child) p; //This statement is not allowed. } }
If we run the program then we will get
An instance of the Parent class was created! An instance of the Parent class was created! An instance of the Child class was created! Exception in thread "main" java.lang.ClassCastException: co.java.exception.Parent cannot be cast to co.java.exception.Child at co.java.exception.ClassCastExceptionExample.main(ClassCastExceptionExample.java:20)
Explanation:
In The Above Program, we are creating an instance of both the parent and child class. but when we are trying to assign the parent class instance to child class instance that will generate an exception.
Ref: Article
Reader Interactions